我已经阅读了关于Optional.orElse()
和Optional.orElseGet()
之间的区别的关于question的答案。
由于懒惰的评估,orElseGet()
似乎总是比orElse()
更有效率,而且即使在对像这样的非常简单的示例进行基准测试时,也很明显(见第4部分):https://www.baeldung.com/java-optional-or-else-vs-or-else-get
因此,在任何使用案例中,最好使用orElse
而不是orElseGet
吗?
答案 0 :(得分:8)
orElse
时键入的内容较少,因为它比orElseGet
短,并比较它们的签名:orElse(T other)
orElseGet(Supplier<? extends T> other)
Supplier<? extends T> other
最有可能比T other
长。如果性能不是很关键,则可以选择减少键入。程序员的努力也很重要:-)例如,比较:
orElseGet(() -> 1)
orElse(1)
默认情况下,每次使用orElseGet()更加有意义,除非 默认对象已经构建并且可以直接访问。
答案 1 :(得分:2)
可能更可取的主要用例之一是,当您知道需要退回到默认的常量(甚至是已创建的对象)时。我的意思是,只比较这有多穷:
int first = Stream.of(1,3,5).filter(i->i%2==0).findFirst().orElseGet(new Supplier<Integer>() {
@Override
public Integer get() {
return 1;
}
});
或其lambda表示形式
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);
答案 2 :(得分:1)
下面是简短的答案,有关更详细的答案,请查看my stackoverflow answer here
Optional.isPresent()
的值如何Optional.isPresent() == false
由于第一种方法将始终获取资源,因此当所需的资源获取昂贵时,您可能需要考虑第二种方法。