ภาพรวม
Java 9 เพิ่มเมธอดใหม่ให้ Optional คือ ifPresentOrElse() และ or() เพื่อเพิ่มความสามารถในการจัดการค่าที่อาจเป็น null
Optional.ifPresentOrElse()
วัตถุประสงค์: ถ้ามีค่า -> รัน action, ไม่มีค่า -> รัน emptyAction
Syntax
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
ตัวอย่าง
Optional<String> optional = Optional.of("Test");
AtomicInteger success = new AtomicInteger();
AtomicInteger empty = new AtomicInteger();
optional.ifPresentOrElse(
x -> success.incrementAndGet(),
() -> empty.incrementAndGet()
);
// success=1, empty=0
Optional emptyOpt = Optional.empty();
emptyOpt.ifPresentOrElse(
x -> success.incrementAndGet(),
() -> empty.incrementAndGet()
);
// success=0, empty=1
Optional.or()
วัตถุประสงค์: ถ้ามีค่า -> คืน Optional นั้น, ไม่มีค่า -> คืน Optional จาก Supplier
Syntax
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
ตัวอย่าง
Optional<String> opt1 = Optional.of("Test1");
Optional<String> opt2 = Optional.of("Test2");
Optional<String> result = opt1.or(() -> opt2); // "Test1"
Optional<String> empty = Optional.empty();
Optional<String> result2 = empty.or(() -> opt2); // "Test2"
ตารางเปรียบเทียบ
| คุณสมบัติ | ifPresentOrElse() | or() |
|---|---|---|
| พารามิเตอร์ | Consumer + Runnable (2 ตัว) | Supplier (1 ตัว) |
| คืนค่า | void (ทำ side effect) | Optional<T> |
| ใช้เมื่อ | ต้องการรัน logic ทั้ง 2 กรณี | ต้องการ Optional สำรอง (fallback) |
สรุป
ifPresentOrElseใช้สำหรับ branching logic (ทำอย่างนี้ถ้ามีค่า, ทำอย่างนั้นถ้าไม่มี)orใช้สำหรับ提供 fallback Optional เมื่อค่าเป็น empty