ท่อสามท่อนบนโต๊ะมิ้นต์ กรองแล้วแปลงค่า มีจุดอำพันที่ช่องว่าง

Java Optional: ใช้ filter+map เป็นท่อ แทน if ซ้อน

น้องกายEngineering

เคยเขียน if (x != null) { if (x.getY() != null) ... } จนอ่านไม่รู้เรื่องไหมครับ — ใน Java ใช้ Optional ช่วยจัดเป็นท่อได้

ไอเดียสั้น ๆ:

  • filter = เงื่อนไขที่ต้องผ่าน (คืน Optional เดิมหรือว่าง)
  • map = แปลงค่าข้างในถ้ายังมี
  • orElse / orElseThrow = จบท่อให้ได้ค่าจริง
import java.util.Optional;

public class Main {
  static Optional<String> domain(String email) {
    return Optional.ofNullable(email)
        .filter(s -> s.contains("@"))
        .map(s -> s.substring(s.indexOf('@') + 1))
        .filter(d -> !d.isBlank());
  }

  public static void main(String[] args) {
    System.out.println(domain("[email protected]").orElse("missing"));
    System.out.println(domain("not-an-email").orElse("missing"));
    assert domain("[email protected]").orElseThrow().equals("b.co");
  }
}

ข้อควรระวัง: อย่าใช้ Optional เป็นฟิลด์ทุกตัวในโดเมนใหญ่โดยไม่จำเป็น — เหมาะกับค่าคืนจากเมธอดที่ “มีหรือไม่มี”

Recap

  • ลองย้าย null-check ซ้อน 1–2 ชั้นมาเป็น filter/map
  • จบท่อด้วย orElse ที่ความหมายธุรกิจชัด
  • อย่าห่อ Optional ซ้อน Optional