Optional的API通常有两种可能引起混淆的方法: orElse() 和orElseGet():
String name = Optional.of("baeldung").orElseGet(() -> getRandomName()); |
结论:对于上面这个示例,orElseGet()明显优于 orElse() 。仅当不存在Optional 值时才执行作为参数传递Supplier方法(orElseGet()的参数函数为() -> getRandomName(),该方法只有不存在"baeldung"值时才会执行);而orElse()涉及每次运行的getRandomName()方法的计算 。
除了性能方面,其他值得考虑的因素还包括:
- 如果该方法将执行一些附加逻辑怎么办?例如,进行一些数据库插入或更新
- 即使当我们为orElse() 参数分配一个对象时:String name = Optional.of("baeldung").orElse("Other")
我们仍然无缘无故地创建“Other” 对象
这就是为什么对我们而言,根据需要在orElse() 和orElseGet()中 做出谨慎的决定非常重要–默认情况下,每次使用orElseGet() 更为有意义,除非默认对象已经构造并且可以直接访问。