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!");
// 使用 orElse
String result1 = optional.orElse(getDefaultValue());
System.out.println("Result with orElse: " + result1);
// 使用 orElseGet
String 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 被用于复杂逻辑时!