optional 通过链式调用简化多层判空,支持 map/flatmap 拆解嵌套路径、orelse 系列定义兜底行为,仅作返回值不作字段或参数,统一用 ofnullable 处理空值。

Optional 能把多层判空的“俄罗斯套娃”式 if 改成链式调用,让逻辑聚焦在业务本身,而不是防御性检查上。
用 map 和 flatMap 拆解嵌套对象路径
当需要从 user.getAddress().getCity().getName() 这类路径取值时,传统写法要连写三层 if;Optional 可以把每一步都封装成可选操作:
- userOptional.map(User::getAddress).map(Address::getCity).map(City::getName) —— 每个 map 在值为 null 时自动跳过后续,返回空 Optional
- 若中间某步可能返回 null 对象(比如 getAddress() 返回 null),就用 flatMap 替代 map,避免嵌套 Optional
> - 例如:userOptional.flatMap(u -> Optional.ofNullable(u.getAddress())),确保始终是单层 Optional
用 orElse 系列方法明确兜底行为
取值失败不等于程序崩溃,而是按需定义默认行为:
- .orElse("未知城市") —— 直接给常量默认值
- .orElseGet(() -> fetchFromCache()) —— 延迟计算,默认值较重时更高效
- .orElseThrow(() -> new BusinessException("地址信息缺失")) —— 显式抛出业务异常,比 NPE 更语义清晰
只作返回值,不作字段或参数
Optional 的设计初衷是作为方法返回值,用于表达“可能没有”的计算结果:
- 不要把它作为实体类字段(如 private Optional
name; ),这会增加序列化、持久化和调试成本 - 不要用它包装集合(如 Optional
- >
- 构造参数、方法入参也尽量避免 Optional,调用方传 null 就该由它自己负责校验
统一用 ofNullable 处理原始空值
把原始对象转成 Optional 应该集中、明确:
- 用 Optional.ofNullable(obj) 处理可能为 null 的引用(最常用)
- 用 Optional.of(obj) 仅当你能 100% 确保 obj 非 null(否则立刻抛 NPE)
- 避免手写 obj == null ? Optional.empty() : Optional.of(obj),既啰嗦又易错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











