orelseget通过supplier实现延迟计算:仅当optional为空时才执行get()生成默认值,避免无谓开销;而orelse每次调用都立即创建对象,无论optional是否有值。

orElseGet 通过传入 Supplier 实现延迟计算:只有当 Optional 为空时,才调用 Supplier 的 get() 方法生成默认值,避免无谓的开销。
为什么需要延迟计算
直接用 orElse(new ExpensiveObject()) 会在每次调用时都创建对象,哪怕 Optional 不为空。而 orElseGet(() -> new ExpensiveObject()) 只在真正需要默认值(即 Optional 为 empty)时才执行 lambda 表达式,节省资源。
Supplier 是什么
Supplier 是一个无参数、有返回值的函数式接口。它不接收输入,只负责“供应”一个结果。orElseGet 正是依赖它来按需生成默认值。
- 写法示例:
() -> "default"、() -> computeDefault()、MyUtils::getDefault - 注意:Supplier 实例本身不执行逻辑,只有被 orElseGet 内部调用
get()时才触发
对比 orElse 和 orElseGet 的执行时机
看这段代码的实际行为:
Optional<string> opt = Optional.of("hello");
String a = opt.orElse(createDefault()); // 立即执行 createDefault()
String b = opt.orElseGet(() -> createDefault()); // 不执行 createDefault()</string>
即使 opt 有值,orElse 仍会先算出默认值再丢弃;orElseGet 则跳过 Supplier 执行,真正“懒”。
常见误用和注意事项
- 别把有副作用的操作写进 Supplier,除非你明确希望它只在空值时发生(比如日志、数据库查询)
- Supplier 不能抛受检异常,如需处理,得包装成 RuntimeException 或用 try-catch 在 lambda 内部处理
- 如果默认值是常量或简单表达式,orElse 更简洁;复杂/耗时逻辑才推荐 orElseGet
不复杂但容易忽略——关键就在“只在需要时才算”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











