Optional 的 orElseGet 和 orElse区别
Optional 是 Java 8 引入的一个容器类,用于优雅地处理可能为 null 的值。虽然 Optional 的常见用法(如 orElse)被广泛使用,但 orElseGet 和 orElse 的区别却常常被忽略,合理使用它们可以优化性能并避免不必要的开销。
orElse
立即求值:即使 Optional 中有值,orElse 中的替代值也会被求值。
适用于替代值计算成本较低的情况。
orElseGet
惰性求值:只有当 Optional 中的值不存在时,orElseGet 中的替代逻辑才会被执行。
适用于替代值计算成本较高的情况。
代码示例:
import java.util.Optional;public class OptionalExample {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello, World!");// 使用 orElseString result1 = optional.orElse(getDefaultValue());System.out.println("Result with orElse: " + result1);// 使用 orElseGetString result2 = optional.orElseGet(() -> getDefaultValue());System.out.println("Result with orElseGet: " + result2);}private static String getDefaultValue() {System.out.println("Computing default value...");return "Default Value";}
}
输出结果:
Computing default value...
Result with orElse: Hello, World!
Result with orElseGet: Hello, World!
为什么 orElse 会执行 getDefaultValue?
即使 Optional 中存在值,orElse 会立即调用 getDefaultValue 方法,哪怕最终用不到替代值。
相比之下,orElseGet 使用了 Lambda 表达式,只有在需要时才执行替代逻辑。
实际场景对比
- 低成本替代值 (适合orElse)
Optional<String> optional = Optional.empty();
String result = optional.orElse("Simple Default Value");
System.out.println(result);
- 高成本替代值 (适合orElseGet)
Optional<String> optional = Optional.empty();
String result = optional.orElseGet(() -> {// 模拟复杂计算return computeExpensiveValue();
});
System.out.println(result);
总结
- 用 orElse:当替代值是简单的常量或轻量级计算时。
- 用 orElseGet:当替代值的计算比较昂贵或需要依赖上下文时。
这个小技巧在性能优化和代码整洁度上能起到很大的作用,尤其是当 Optional 被用于复杂逻辑时!