Java Optional.ifPresentOrElse: แยกทางมีค่ากับไม่มีค่าให้ชัด
น้องกายEngineering
เวลามี Optional แล้วอยากทั้งบันทึกค่าและแจ้งว่าไม่มีค่า การแยก isPresent แล้ว get อ่านยาก ifPresentOrElse รวมสองทางไว้ในเมธอดเดียวครับ
WHY: สองทางชัดในที่เดียว
เหมือนแยกแถวรับพัสดุ — มีของก็เซ็นรับ ไม่มีก็ลงบันทึกว่าไม่พบ ไม่ต้องเปิดกล่องเปล่า
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class Main {
static void handle(Optional<String> name, List<String> log) {
name.ifPresentOrElse(
n -> log.add("hi:" + n),
() -> log.add("missing"));
}
public static void main(String[] args) {
List<String> log = new ArrayList<>();
handle(Optional.of("Kay"), log);
assert log.get(0).equals("hi:Kay");
log.clear();
handle(Optional.empty(), log);
assert log.get(0).equals("missing");
assert log.size() == 1;
System.out.println("ifPresentOrElse verified");
}
}
HOW: Consumer คู่ Runnable
อาร์กิวเมนต์แรกคือ Consumer เมื่อมีค่า อาร์กิวเมนต์สองคือ Runnable เมื่อว่าง ใช้กับล็อก / เมตริก / ค่าเริ่มต้นฝั่ง UI ได้ดี แต่ถ้าต้องการคืนค่าจากทั้งสองทาง พิจารณา orElse / orElseGet / map แทน
GOTCHA: side-effect ไม่ใช่ expression
ifPresentOrElse คืน void — อย่าฝืนใช้ในสาย stream ที่ต้องการค่า แยกหน้าที่ให้ชัด
Recap
- ใช้เมื่อต้องการ side-effect สองทาง
- อย่า
get()หลังisPresentโดยไม่จำเป็น - ถ้าต้องคืนค่า ใช้
orElse*/map