orElse立即执行传入的固定值,适合轻量无副作用默认值;orElseGet延迟执行Supplier逻辑,适合高成本或有副作用的默认值生成。

orElse 和 orElseGet 都用于在 Optional 为空时提供默认值,但它们的执行时机和适用场景不同:前者直接传入固定值,后者延迟执行 Supplier 提供的逻辑。
orElse:立即计算,默认值是确定的值
当你有一个明确、无副作用、开销小的默认值(比如常量、字面量或简单对象)时,用 orElse 最简洁。
- 参数是具体值,方法调用时就会被求值,无论 Optional 是否为空
- 适合:
"unknown"、0、new ArrayList()等轻量默认值 - 不推荐用于耗时或有副作用的操作(如数据库查询、文件读取),因为即使 Optional 有值也会执行
示例:
String name = optionalName.orElse("guest"); // "guest" 总是被创建并传入orElseGet:延迟执行,适合复杂或有代价的默认逻辑
orElseGet 接收一个 Supplier,仅在 Optional 为空时才调用其 get() 方法。这能避免不必要的计算。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 参数是函数式接口,只在需要时才执行
- 适合:从缓存加载、调用远程服务、构造大对象、日志记录等场景
- 性能更优,语义更清晰——“空的时候才去获取”
示例:
String name = optionalName.orElseGet(() -> fetchDefaultNameFromDB()); // fetchDefaultNameFromDB() 仅在 optionalName 为空时调用别用 orElse(null) 或 orElseGet(() -> null)
这会破坏 Optional 的初衷,让空值风险重新出现。如果业务上允许 null,请直接用普通引用;如果想保持安全链式调用,应返回有意义的默认值或抛出异常(如 orElseThrow())。
-
optional.orElse(null)→ 不如直接写optional.orElse("N/A") -
optional.orElseGet(() -> null)→ 等价于optional.orElse(null),同样不推荐
简单判断:选哪个?
问自己一个问题:这个默认值的生成是否“便宜且无副作用”?
- 是 → 用
orElse(value) - 否(要查库、发请求、建对象、记日志…)→ 用
orElseGet(() -> ...)
不复杂但容易忽略。

















