何时使用Optional.orElse()而不是Optional.orElseGet()

时间:2019-01-09 02:13:32

标签: java java-8 optional

我已经阅读了关于Optional.orElse()Optional.orElseGet()之间的区别的关于question的答案。

由于懒惰的评估,orElseGet()似乎总是比orElse()更有效率,而且即使在对像这样的非常简单的示例进行基准测试时,也很明显(见第4部分):https://www.baeldung.com/java-optional-or-else-vs-or-else-get

因此,在任何使用案例中,最好使用orElse而不是orElseGet吗?

3 个答案:

答案 0 :(得分:8)

  1. 在大多数情况下,使用orElse时键入的内容较少,因为它比orElseGet短,并比较它们的签名:

orElse(T other)
orElseGet(Supplier<? extends T> other)

Supplier<? extends T> other最有可能比T other长。如果性能不是很关键,则可以选择减少键入。程序员的努力也很重要:-)例如,比较:

orElseGet(() -> 1)
orElse(1)
  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

  • orElse()将始终调用给定函数,无论是否需要,无论Optional.isPresent()的值如何
  • orElseGet()仅在Optional.isPresent() == false
  • 时调用给定函数

由于第一种方法将始终获取资源,因此当所需的资源获取昂贵时,您可能需要考虑第二种方法。