我已经阅读了有关Optional.orElse()
和Optional.orElseGet()
之间区别的问题的答案。
似乎orElseGet()
总是比orElse()
更有效率,因为它使用了惰性求值,即使在基准测试非常简单的示例时也明显可见(参见部分4):https://www.baeldung.com/java-optional-or-else-vs-or-else-get
那么,在什么情况下最好使用orElse
而不是orElseGet
?
我已经阅读了有关Optional.orElse()
和Optional.orElseGet()
之间区别的问题的答案。
似乎orElseGet()
总是比orElse()
更有效率,因为它使用了惰性求值,即使在基准测试非常简单的示例时也明显可见(参见部分4):https://www.baeldung.com/java-optional-or-else-vs-or-else-get
那么,在什么情况下最好使用orElse
而不是orElseGet
?
orElse
比使用orElseGet
更短,因为它的签名比较简洁:orElse(T other)
orElseGet(Supplier<? extends T> other)
Supplier<? extends T> other
比 T other
更长。如果性能不是很重要,您可以选择输入更少的内容。程序员的努力也很重要 :-) 例如,比较一下:
orElseGet(() -> 1)
orElse(1)
其中一个主要用例是当你知道需要回退到一个常量(甚至已经创建好的对象)作为默认值时,使用它可能更加可取。我的意思是,只需比较一下这种情况会有多糟糕:
int first = Stream.of(1,3,5).filter(i->i%2==0).findFirst().orElseGet(new Supplier<Integer>() {
@Override
public Integer get() {
return 1;
}
});
int first = Stream.of(1,3,5).filter(i->i%2==0).findFirst().orElseGet(() -> 1);
int first = Stream.of(1,3,5).filter(i->i%2==0).findFirst().orElse(1);
Optional.isPresent()
的值为何,都会调用给定的函数。Optional.isPresent() == false
时才会调用给定的函数。由于第一种方法总是获取资源,因此当所需资源获取成本较高时,您可能需要考虑使用第二种方法。