optional.or()是java 9引入的惰性链式备选方法,接收supplier,仅当前optional为空时执行,返回optional以支持持续链式操作。

Java 中的 Optional.or() 是 Java 9 引入的关键方法,专为“多级 fallback”场景设计——它让你能像搭积木一样把多个备选值获取逻辑串起来,而且只在真正需要时才执行后续步骤。
or() 的核心特点:惰性 + 可链式
or() 接收一个 Supplier<optional>></optional>,仅当当前 Optional 为空时才调用该供给器,并返回它产生的 Optional<t></t>。这意味着:
- 前面的环节失败了,才会触发下一个供给器(完全惰性)
- 返回仍是
Optional<t></t>,可继续接map、filter、甚至另一个or - 不同于
orElseGet()(返回的是T),or()保持上下文,适合构建策略链
典型串联写法:从高优先级到兜底
比如读取一个配置项,按顺序尝试系统属性 → 环境变量 → 配置文件 → 硬编码默认值:
Optional
.or(() -> Optional.ofNullable(System.getenv("APP_TIMEOUT")))
.or(() -> loadFromConfigFile("timeout"))
.or(() -> Optional.of("30000"));
其中 loadFromConfigFile() 是一个返回 Optional<string></string> 的方法,内部可能做文件 I/O 或解析,但只有前三步都空时才执行。
组合使用 map / flatMap 做后续处理
拿到最终 Optional<string></string> 后,可直接链式加工:
- 转成整数:
.map(Integer::parseInt).orElse(30000) - 过滤非法值:
.filter(s -> !s.trim().isEmpty()).map(Integer::parseInt).orElse(30000) - 再 fallback 一次(比如 parseInt 失败时):
.map(s -> { try { return Integer.parseInt(s); } catch (NumberFormatException e) { return null; } }).or(() -> Optional.of(30000))
注意事项:别和 orElseGet 混用错场景
or() 是为了延续 Optional 上下文;而 orElseGet() 是终结操作,返回具体值。如果已经确定要收尾,就用后者:
- 想继续链式处理(如再 map、再 or)→ 用
or() - 只想拿一个最终结果(比如传给日志、存库、返回 API)→ 用
orElse()或orElseGet() - 不要写成
.or(() -> Optional.of(someExpensiveCall())),这会提前执行;应确保供给器内部是延迟动作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











