orelseget在optional为空时才执行supplier获取默认值,有值则直接返回;相比orelse可避免不必要的计算开销,适用于高成本初始化场景。

orElseGet 是 Optional 中用于安全获取值的方法之一,它在 Optional 为空(isEmpty() 为 true)时,才执行传入的供给函数(Supplier<t></t>)来生成默认值;如果 Optional 有值,则直接返回该值,**不会调用供给函数**。这比 orElse 更高效、更灵活,尤其适用于默认值创建开销大或有副作用的场景。
orElseGet 的基本用法
语法:
optional.orElseGet(() -> defaultValue)
说明:
- 参数是一个 Supplier<t></t>,即无参、返回 T 类型对象的函数式接口;
- 仅当 Optional 为空时才会执行该 lambda 或方法引用;
- 不会提前计算默认值,避免不必要的对象创建或 I/O、数据库查询等操作。
和 orElse 的关键区别
对比示例:
不推荐(可能浪费资源):String name = optionalName.orElse(createDefaultName()); // createDefaultName() 总是会被调用
推荐(按需执行):String name = optionalName.orElseGet(() -> createDefaultName()); // createDefaultName() 仅在 optionalName 为空时调用
常见误区:把 orElse 和 orElseGet 当作功能等价,其实它们的执行时机完全不同。
实用写法与常见场景
- 使用方法引用替代 lambda(更简洁):
optional.orElseGet(this::getDefaultUser) - 结合外部服务或配置获取默认值:
configValue.orElseGet(() -> configService.getDefaultValue("timeout")) - 避免空字符串或零值误判(注意:orElseGet 不处理“逻辑空”,只判断 Optional 是否为空):
Optional<string> opt = Optional.ofNullable(user.getName());<br> String name = opt.filter(s -> !s.trim().isEmpty()).orElseGet(() -> "Anonymous");</string>
- 链式调用中嵌套使用:
user.getAddress().flatMap(Address::getZipCode).orElseGet(() -> "000000")
注意事项
- 供给函数不能返回 null(否则会抛出
NPE),因为 orElseGet 的契约是返回非 null 值; - 如果供给函数本身可能抛异常,需要自行捕获或声明,orElseGet 不做异常封装;
- 不要在供给函数中修改共享状态——虽然能运行,但会破坏函数式语义,降低可读性和可测试性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











