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