Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความสำคัญของ Optional.or() Method ใน Java 9

ใน Java 9 เพิ่ม static methods: stream(), or(), และ ifPresentOrElse() ให้กับคลาส Optional<T> การนำเสนอ Optional class แก้ปัญหา null pointer exception

Optional.or() method คืนค่า Optional ที่อธิบาย value หากมี value อยู่ มิฉะนั้นคืน Optional ที่ผลิตโดย supplying function

Syntax


public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)

ตัวอย่างโค้ด


import java.util.Optional;
import java.util.function.Supplier;

public class OptionalOrTest {
    public static void main(String args[]) {
        Optional<String> optional = Optional.of("TutorialsPoint");
        
        Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
        
        // มีค่า - ใช้ค่าเดิม
        optional = optional.or(supplierString);
        optional.ifPresent(x -> System.out.println("Value: " + x));
        
        // ไม่มีค่า - ใช้ supplier
        optional = Optional.empty();
        optional = optional.or(supplierString);
        optional.ifPresent(x -> System.out.println("Value: " + x));
    }
}

ผลลัพธ์


Value: TutorialsPoint
Value: Not Present

Optional Methods ใหม่ใน Java 9

Method Signature คำอธิบาย
or() Optional<T> or(Supplier<? extends Optional<? extends T>>) คืน Optional นี้ถ้ามีค่า มิฉะนั้นจาก supplier
stream() Stream<T> stream() แปลงเป็น Stream (0 หรือ 1 element)
ifPresentOrElse() void ifPresentOrElse(Consumer<? super T>, Runnable) ทำ action ถ้ามีค่า หรือ action อื่นถ้าไม่มี

ตัวอย่างเพิ่มเติม

or() กับ Method Reference


Optional<String> config = getConfig();
Optional<String> defaultConfig = Optional.of("default");
config = config.or(() -> defaultConfig);
// หรือ
config = config.or(() -> Optional.ofNullable(System.getenv("CONFIG")));

ifPresentOrElse()


optional.ifPresentOrElse(
    value -> System.out.println("Found: " + value),
    () -> System.out.println("Not found, using default")
);

stream() - ใช้กับ Stream Pipeline


List<Optional<String>> optionals = List.of(
    Optional.of("A"), Optional.empty(), Optional.of("B")
);

// Flatten optionals to stream of values
List<String> values = optionals.stream()
    .flatMap(Optional::stream)  // Java 9: Optional.stream()
    .collect(Collectors.toList());
// Result: [A, B]

เปรียบเทียบ or() vs orElse() vs orElseGet()

Method Parameter Return Type Use Case
or() Supplier<Optional<T>> Optional<T> Chain Optional operations
orElse() T T ได้ค่า default ทันที (eager)
orElseGet() Supplier<T> T ได้ค่า default แบบ lazy
orElseThrow() Supplier<X extends Throwable> T โยน exception ถ้าไม่มีค่า

Best Practices

  • ใช้ or() เมื่อต้องการ chain Optional operations ต่อ
  • ใช้ orElseGet() แทน orElse() สำหรับ default values ที่คำนวณยุ่งยาก (lazy)
  • หลีกเลี่ยง Optional.get() โดยตรง - ใช้ orElseThrow() หรือ ifPresent()
  • stream() เหมาะสำหรับ flatMap กับ List<Optional>