首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >`Optional.orElse()`与`Optional.orElseGet()`的区别

`Optional.orElse()`与`Optional.orElseGet()`的区别
EN

Stack Overflow用户
提问于 2015-10-16 20:05:16
回答 3查看 157.7K关注 0票数 259

我正在尝试理解Optional.orElse()Optional.orElseGet()方法之间的区别。

orElse()方法的描述是“如果存在,则返回该值,否则返回其他值”。

orElseGet()方法的描述是“如果值存在,则返回该值,否则调用其他并返回该调用的结果”。

orElseGet()方法接受一个供应商函数接口,该接口本质上不接受任何参数并返回T

在什么情况下需要使用orElseGet()?如果你有一个T myDefault()方法,为什么不直接使用optional.orElse(myDefault())而不是optional.orElseGet(() -> myDefault())呢?

看起来orElseGet()并没有将lambda表达式的执行推迟到以后的某个时间,那么这有什么意义呢?(我认为如果它返回一个更安全的Optional<T>,它的get()永远不会抛出NoSuchElementException,而isPresent()总是返回true……但显然不是这样,它只是像orElse()一样返回T )。

我还遗漏了一些其他的区别吗?

EN

回答 3

Stack Overflow用户

发布于 2016-10-21 12:13:10

我在这里找到了Kudo提到的问题。

我正在与其他人分享我的经验。

orElseorElseGet,这就是问题所在:

代码语言:javascript
复制
static String B() {
    System.out.println("B()...");
    return "B";
}

public static void main(final String... args) {
    System.out.println(Optional.of("A").orElse(B()));
    System.out.println(Optional.of("A").orElseGet(() -> B()));
}

打印

代码语言:javascript
复制
B()...
A
A

orElse计算B()的值与optional的值是相互依赖的。因此,orElseGet是懒惰的。

票数 71
EN

Stack Overflow用户

发布于 2017-01-20 03:06:13

我要说的是,当我们想要在else条件中计算一些东西以获得新值时,orElseorElseGet之间最大的区别就是。

考虑这个简单的例子-

代码语言:javascript
复制
// oldValue is String type field that can be NULL
String value;
if (oldValue != null) {
    value = oldValue;
} else {
    value = apicall().value;
}

现在,让我们将上面的示例转换为结合使用OptionalorElse

代码语言:javascript
复制
// oldValue is Optional type field
String value = oldValue.orElse(apicall().value);

现在,让我们将上面的示例转换为结合使用OptionalorElseGet

代码语言:javascript
复制
// oldValue is Optional type field
String value = oldValue.orElseGet(() -> apicall().value);

当调用orElse时,将计算apicall().value并将其传递给该方法。然而,在orElseGet的情况下,仅当oldValue为空时才进行求值。orElseGet允许延迟计算。

票数 38
EN

Stack Overflow用户

发布于 2018-08-20 22:16:36

考虑以下代码:

代码语言:javascript
复制
import java.util.Optional;

// one class needs to have a main() method
public class Test
{
  public String orelesMethod() {
    System.out.println("in the Method");
    return "hello";
  }

  public void test() {
    String value;
    value = Optional.<String>ofNullable("test").orElseGet(this::orelesMethod);
    System.out.println(value); 

    value = Optional.<String>ofNullable("test").orElse(orelesMethod());
    System.out.println(value); 
  }

  // arguments are passed using the text field below this editor
  public static void main(String[] args)
  {
    Test test = new Test();

    test.test();
  }
}

如果我们以这种方式获取valueOptional.<String>ofNullable(null),那么orElseGet()和orElse()之间没有区别,但是如果我们以这种方式获取valueOptional.<String>ofNullable("test")orElseGet()中的orelesMethod()将不会被调用,但在orElse()中将被调用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33170109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档