Optional的核心是显式表达“值可能不存在”,创建时须明确语义:of(非空断言)、ofNullable(安全入口)、empty(明确无值);访问必须用orElse、ifPresent等安全方法,禁用get();适用于返回值,不宜作参数或字段。

用Optional处理空指针,核心不是“包装null”,而是让“值可能不存在”这件事在代码里看得见、必须被处理。
创建时就明确意图
别等到取值时才补救,创建Optional的那一刻就要决定语义:
-
确定不为空:用
Optional.of(value)——如果传入null会立刻抛NullPointerException,适合内部断言或已校验场景 -
可能为空:一律用
Optional.ofNullable(value),这是最常用、最安全的入口 -
明确无值:用
Optional.empty(),比返回null更清晰地表达“此处本就不该有值”
访问值必须走安全路径
永远不要裸调get()——它像一把没保险的手枪。正确做法是根据上下文选方法:
- 要默认值?用
orElse("default")(常量)或orElseGet(() -> heavyCompute())(延迟计算) - 要抛异常?用
orElseThrow(() -> new IllegalArgumentException("user missing")) - 只在有值时执行逻辑?用
ifPresent(user -> sendEmail(user)),简洁且无副作用 - 需要分支处理?用
ifPresentOrElse(user -> log(user), () -> logMissing())
链式调用穿透多层嵌套
面对User → Address → City这类易空链路,传统写法层层判空;Optional用map和flatMap一气呵成:
-
map用于转换非Optional结果(如Address::getCity返回String) -
flatMap用于转换返回Optional的方法(如User::getAddress返回Optional<address></address>),避免Optional<optional>></optional>嵌套 - 示例:
Optional.ofNullable(user).flatMap(User::getAddress).map(Address::getZipCode).orElse("000000")
配合Stream做集合级空值过滤
处理用户列表时,想提取所有有效地址的城市名,不用先筛再映射:
- 把每个可能为空的字段转为Optional:
.map(User::getAddress).map(Optional::ofNullable) - 用
filter(Optional::isPresent)剔除空项 - 再
map(Optional::get).map(Address::getCity)拿到最终值 - 整个过程无
if、无try-catch、无null检查
Optional不是万能胶,别把它塞进方法参数或实体字段里——那会模糊API契约、增加调用方负担。它最适合出现在返回值位置,作为“我尽力了,但这个值真不一定有”的坦诚声明。

















