orElseGet()的核心作用是惰性加载:仅当Optional为空时才执行Supplier生成默认值;它接收Supplier而非具体值,避免了orElse(value)的预计算开销,适用于缓存回源、复杂对象构建等场景。

orElseGet() 的核心作用是:当 Optional 为空时,才执行传入的 Supplier 函数来生成默认值——这就是“惰性加载”的关键。
为什么 orElseGet() 是惰性的?
它接收一个 Supplierempty() 时,才会调用这个 Supplier 的 get() 方法。如果 Optional 有值,Supplier 根本不会执行。
对比 orElse(value):后者无论 Optional 是否为空,都会先计算或构造 value(比如 new 对象、调用耗时方法),造成不必要的开销。
典型使用场景示例
常见于需要避免重复计算、延迟初始化、或调用可能抛异常/耗资源的方法时:
- 从缓存查不到数据,再查数据库(避免空查库)
- 构建复杂默认对象(如配置对象、DTO)
- 调用可能抛异常的工厂方法(异常只在真正需要时才暴露)
代码写法要点
正确写法是传递一个 lambda 或方法引用,确保逻辑封装在 Supplier 内部:
String result = optionalString
.orElseGet(() -> computeDefault()); // ✅ 惰性:computeDefault() 仅在 empty 时调用
// 或者用方法引用
String result2 = optionalString
.orElseGet(this::createDefault); // ✅
// ❌ 错误:这会立即执行,失去惰性
String result3 = optionalString.orElse(computeDefault()); // 先算完再传值
注意 null 和异常行为
orElseGet() 不校验 Supplier 返回值是否为 null——如果 Supplier 返回 null,最终结果就是 null(和 orElse(null) 效果一样)。若需防止 null,应自行在 Supplier 内处理;若 Supplier 抛异常,该异常会原样向上抛出。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











