一、背景 / 问题
NullPointerException是空指针异常,是Java开发里最高频的运行时异常。传统编码习惯大量使用if(obj != null)硬编码判空,遇到多层对象嵌套取值时,if层层嵌套,形成金字塔代码,可读性差,维护成本高,还很容易漏判,引发线上空指针报错。JDK8引入的Optional容器类,就是用来优雅处理空值场景,消除多层if嵌套。
二、环境与前提
要求JDK8及更高版本。前置了解:函数式接口、Lambda基础。Optional不是用来完全消除null,而是提供统一安全的空值处理方式,不能滥用。
三、实操步骤
1. 传统多层判空写法
多层对象取值,传统if嵌套写法非常臃肿,容易漏写判断。
public String getUserCity(User user) { if (user != null) { Address address = user.getAddress(); if (address != null) { String city = address.getCity(); if (city != null && !city.isEmpty()) { return city; } } } return "未知城市"; }2. Optional链式取值改造
使用ofNullable封装对象,配合map链式调用,完成多层对象取值,orElse设置默认兜底值。
public String getUserCityOpt(User user) { return Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("未知城市"); }3. 常用方法说明
ofNullable:支持null和非null对象,业务开发首选。orElse:无论是否为空,都会创建兜底对象;orElseGet仅为空才执行,性能更好。ifPresent:对象非空时执行回调逻辑。
四、坑点与注意事项
- 不要直接调用get()方法,未判空调用get会抛出异常。
- 不要把Optional作为方法参数或者实体类字段,会增加不必要的复杂度。
- 不要将Optional变量赋值为null,违背Optional的设计初衷。
- 简单单层参数判空,不需要强行使用Optional,普通if判空更简洁。
五、总结
Optional适合多层对象链式取值场景,能够消除嵌套if,统一空值处理逻辑,合理使用可以有效降低空指针异常概率。