ใน 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>