นากกายยืนแยกสองทาง มีกล่องพัสดุกับทางว่าง

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