Lambda 表达式本身不直接处理空指针异常,但通过与 Optional 配合,可在链式取值、filter 校验、orElseGet 延迟初始化及避免 get() 等场景中从设计层面规避 NPE。

Lambda 表达式本身不直接“处理”空指针异常(NPE),但它能和 Optional 配合,从设计层面规避 NPE 的发生场景——尤其在链式取值、条件转换、默认 fallback 等环节。
用 Optional + map 实现安全的链式取值
传统写法容易因中间对象为 null 而崩溃:
// 危险:user 或 address 为 null 时抛 NPE
String city = user.getAddress().getCity();
改用 Optional 封装后,map 会自动跳过 null:
立即学习“Java免费学习笔记(深入)”;
String city = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");
只要任意一环为 null,后续 map 不执行,最终由 orElse 提供兜底值。
结合 filter 做空值+业务逻辑双重校验
比如查订单并只处理金额超百的订单项:
Optional.ofNullable(orderService.findOrder(id))
.filter(order -> order.getAmount() > 100)
.map(Order::getItems)
.ifPresent(items -> items.forEach(System.out::println));
这里 filter 既跳过 null,也过滤不满足条件的非空对象;整个链条天然免疫 NPE。
用 orElseGet 替代硬编码默认值
当默认值构造开销大(如新建对象、远程调用),应避免 orElse 中直接 new:
- 不推荐:.orElse(new ExpensiveObject()) —— 每次都执行,哪怕 Optional 有值
- 推荐:.orElseGet(() -> createExpensiveObject()) —— 仅在为空时才调用 Supplier
这不仅提升性能,也让空值处理逻辑更清晰、更可控。
慎用 get(),优先走声明式路径
Optional.get() 是反模式入口:一旦忘记 isPresent() 就可能触发 NoSuchElementException(虽不是 NPE,但仍是运行时异常)。
应始终选择声明式方法:
- 要取值 + 默认值 → 用 orElse / orElseGet
- 要取值 + 抛业务异常 → 用 orElseThrow
- 要消费值(无返回)→ 用 ifPresent
- 要转换再消费 → 用 map + ifPresent 或链式 orElse
所有这些方法都无需显式判空,也就绕开了手动 if (x != null) 的易错路径。


















