学Java Optional应抓住设计意图→理清字段与构造逻辑→对照API反推实现→验证边界场景;核心是理解EMPTY单例、value不可变性、of/ofNullable/empty创建逻辑及get/orElse/map/flatMap等方法行为。

先看核心字段和构造逻辑
源码里真正干活的只有两个东西:
-
private static final Optional<?> EMPTY:一个全局共享的空实例,所有
empty()调用都返回它(类型擦除后强转),省对象、保单例 -
private final T value:唯一数据字段。值存在 →
value != null;值不存在 →value == null。final 保证不可变
两个私有构造函数也由此而来:Optional() 设 value = null;Optional(T) 要求 value != null(否则抛 NullPointerException)。理解这点,就懂为什么 of(null) 必崩、ofNullable(null) 却安全。
从 of / ofNullable / empty 入手读创建逻辑
这三个静态工厂方法是入口,源码极简但信息量大:
-
empty():直接返回(Optional<T>) EMPTY—— 强制类型转换靠泛型擦除兜底,运行时安全 -
of(T value):new 一个Optional<T>(value),内部调Objects.requireNonNull校验 -
ofNullable(T value):return value == null ? empty() : of(value)—— 本质是前两者的组合判断
读到这里,就能解释日常疑问:为什么不能用 == Optional.empty() 判空?因为 empty() 返回的是类型安全的泛型实例,不是同一个引用(虽然底层共享 EMPTY,但强转后 identity 不同);正确方式永远是 isPresent() 或 isEmpty()。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
重点盯 get / orElse / orElseGet / map / flatMap 的实现逻辑
这些方法决定了 Optional 怎么“安全取值”和“链式转化”。源码共性明显:
-
get():直接return value,但前面加了if (value == null) throw new NoSuchElementException() -
orElse(T other):return value != null ? value : other—— 简单三元,无延迟 -
orElseGet(Supplier<? extends T> other):return value != null ? value : other.get()—— 只在空时才触发 Supplier,适合开销大的默认值生成 -
map(Function):值存在才执行函数,结果包装成新 Optional;值为空直接返回empty() -
flatMap(Function<T, Optional<U>>):和 map 类似,但函数本身返回 Optional,避免Optional<Optional<U>>嵌套
对比 map 和 flatMap 就能明白设计动机:比如 user.getAddress().getCity() 易空,用 userOpt.flatMap(User::getAddress).flatMap(Address::getCity) 一层层安全解包,不用写 if 判空。
避开源码学习的典型误区
很多人卡在“看得懂但不会用”,常因混淆语义或误读约束:
- 别把 Optional 当集合用:它不是容器类(Collection),不支持遍历、增删,只表达“有或没有”
- 别在字段或参数里声明 Optional:JDK 明确建议它只用于返回值,用于入参或成员变量反而增加调用方负担
-
别滥用 isPresent() + get():这等于回到 if-null 模式,失去 Optional 的链式优势;优先用
ifPresent、map、orElse等组合 -
别重写 equals/hashCode/== 判等:Optional 是 value-based class,JVM 不保证其 identity,官方禁止用
==或同步操作
源码本身不到 300 行,静下心对照 JDK 源码(java.util.Optional)逐行跟一遍,配合几个调试断点(比如 ofNullable(null).orElse("x")),比看十篇博客更扎实。

















