java optional核心是三条主线:创建(of非空、ofnullable容null、empty显式空)、判断(ispresent/isempty语义化)和取值处理(orelse/orelseget/map链式安全操作),需规避字段/参数滥用、裸get及stream嵌套等坑。

记Java Optional思维导图,关键不是背全图,而是抓住三条主线:怎么创建、怎么判断、怎么取值或处理。图可以辅助,但核心是理解每种方法的适用场景和限制。
创建方式就三类,对应三种空安全意图
记法:用“谁敢传null”来区分
- Optional.of(value):只收非null——传null立刻抛NPE,适合你100%确定不为空的场景(比如配置项已校验)
- Optional.ofNullable(value):来者不拒——null变empty,非null变包装,日常最常用,替代所有可能为null的返回值包装
- Optional.empty():明确声明“这里没值”,常用于方法默认返回、条件未满足时的占位
判断是否存在,别再写if (obj != null)
把null检查变成语义化动作
- isPresent():返回boolean,适合简单分支逻辑(如日志提示、开关控制)
- isEmpty()(Java 11+):语义更直白,可读性更强,推荐新项目优先用
- 注意:不要用isPresent() + get()组合——这等于绕了一圈又回到易出错的老路
取值与转换,重点记三个安全链式方法
它们让代码从“防御式嵌套”变成“声明式流水线”
- orElse(T other):有值就返回,没值就给默认值(注意other会被立即计算)
- orElseGet(Supplier extends T> other):延迟执行,默认值按需生成,适合开销大的构造逻辑
-
map(Function
mapper) :值存在才转换,不存在直接返回empty——避免空指针的同时省掉if判断 - 进阶搭配:filter(Predicate)筛条件、flatMap处理嵌套Optional、ifPresent(Consumer)做副作用操作
避坑点比语法更重要
这些细节一错,Optional反而增加风险
- Optional不能作为字段或参数类型——它不是设计来持久化或跨方法传递的
- 别用get()裸奔——除非你刚调过isPresent()且中间无并发干扰,否则就是埋雷
- 流中慎用Optional:Stream
>容易导致嵌套空判断,通常应先flatMap转成Stream - Optional.ofNullable(null).map(...) 是安全的;Optional.of(null).map(...) 直接崩
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











