本文介绍如何使用 optional 的 map 和 filter 方法链式判断一个嵌套 optional 值是否非空且等于目标值,替代冗长的 ispresent() + get() + equals() 组合,提升代码可读性与安全性。
在 Java 8+ 中,Optional 的设计初衷正是为了避免显式调用 get() 和 isPresent() 的样板代码,尤其在处理嵌套 Optional(如 Optional → Optional)时,直接解包极易引发 NoSuchElementException 或空指针风险。
你原来的写法:
Optional order = getOrder(); // API Call
if (
order.getCustomer().isPresent() &&
order.getCustomer().get().equals(INTERNAL_CUSTOMER)
) {
return;
}
存在两个关键问题:
- ❌ order.getCustomer().get() 在 Optional.empty() 时会抛出异常(若 getCustomer() 返回空 Optional);
- ❌ 即使 isPresent() 先校验,两次调用 order.getCustomer() 也违背函数式原则,且可能因副作用导致不一致(如 getCustomer() 非纯方法)。
✅ 推荐写法(安全、简洁、一次求值):