Optional核心用法有三:装值选ofNullable(主力)、of(非空场景)、empty(明确无数据);取值避get(),用orElse/orElseGet/orElseThrow;链式处理用map/filter/flatMap/ifPresent实现清晰逻辑。

直接读核心用法,别被“终极”吓住——它本质就三件事:怎么装值、怎么安全取值、怎么链式处理。
怎么装值:选对创建方式
不是所有创建方法都适合日常使用:
- Optional.ofNullable(value) 是主力,数据库查不到、接口返回 null、用户没填字段……统统交给它,安全又省心;
- Optional.of(value) 只用于你100%确定不会为 null 的场景(比如常量、已校验过的内部对象),传 null 立刻抛 NullPointerException;
- Optional.empty() 适合明确表示“此处无数据”,比如兜底逻辑或初始化空状态,语义比 ofNullable(null) 更清晰。
怎么安全取值:避开 get() 这个坑
别一上来就调 get()——它像定时炸弹,空时炸出 NoSuchElementException:
- 要默认值?用 orElse("xxx"),简单直接,但注意:无论 Optional 是否有值,右边表达式都会执行;
- 默认值构造成本高(比如 new 对象、查 DB)?改用 orElseGet(() -> expensiveDefault()),只在真为空时才调用;
- 空了必须报错?用 orElseThrow(() -> new BizException("找不到配置")),异常类型和消息完全可控。
怎么链式处理:用 map/filter/flatMap 写出清晰逻辑
这才是 Optional 的真正价值——把嵌套判空变成一行流水线:
-
map 做转换:Optional
→ .map(User::getEmail) → Optional ; - filter 做校验:.filter(email -> email.contains("@")),不满足就变 empty;
-
flatMap 解决“套娃”:比如 User 里有个 Optional,用 flatMap 可以扁平化,避免 Optional
>; - 最后用 ifPresent 消费结果,或 ifPresentOrElse(Java 9+)统一处理“有/无”两种分支。
记住:Optional 是返回值的契约,不是字段、不是参数、不放集合里。用对地方,代码会更稳、更短、更易懂。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











