optional.or()用于当前optional为空时延迟构造并返回替代optional,保持容器语义以支持链式操作;它接收supplier,仅empty时执行,返回optional而非具体值,适用于配置fallback等需“切换容器”场景。

Optional.or() 方法用于在当前 Optional 为空(empty())时,提供一个替代的 Optional 作为备选值,它接收一个 Supplier<optional>></optional>,延迟计算并返回非空的 Optional。
or 方法的核心用法
不同于 orElse() 或 orElseGet() 返回具体值,or() 返回的是另一个 Optional,适合需要保持容器语义、避免提前解包或支持链式操作的场景。
- 签名:
public Optional<t> or(Supplier<optional>> supplier)</optional></t> - 仅当调用方为
Optional.empty()时,才执行 supplier;否则直接返回原 Optional - supplier 返回的 Optional 可以是 empty,也可以是非空 ——
or()不做进一步判断,原样返回
典型使用场景
常见于配置 fallback、多级缓存查询、权限兜底等需“切换容器”而非“提供默认值”的逻辑。
- 从本地缓存查不到,再查远程服务(两者都返回
Optional<user></user>):
Optional<user> user = localCache.get(userId)
.or(() -> remoteService.findUserById(userId));</user>
- 尝试读取系统属性,失败则读取环境变量(都封装为 Optional):
Optional<string> config = Optional.ofNullable(System.getProperty("app.timeout"))
.or(() -> Optional.ofNullable(System.getenv("APP_TIMEOUT")))</string>
与 orElseGet 的关键区别
or() 保持 Optional 类型,适合继续调用 map()、filter()、ifPresent() 等;orElseGet() 解包为实际值,后续操作需重新包装或改变流程。
- ✅ 正确链式处理:
user.or(() -> fetchDefaultUser())
.map(User::getRole)
.filter(role -> role.equals("ADMIN"))
.ifPresent(this::grantPrivileges);
- ❌ 若用
orElseGet(),则fetchDefaultUser()必须返回User实例,无法自然衔接 map/filter
注意事项
supplier 中不应抛出受检异常(否则需包装为 RuntimeException),且应尽量轻量 —— 它只在 empty 时触发。
- 不要在 supplier 里做耗时或副作用操作(如发 HTTP 请求),除非你明确接受该操作只在 fallback 时执行
- 若 supplier 返回
Optional.empty(),结果仍是 empty ——or()不递归 fallback - JDK 9 引入,确保运行环境 ≥ Java 9
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











