我正在尝试理解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
)。
我还遗漏了一些其他的区别吗?
发布于 2016-10-21 12:13:10
我在这里找到了Kudo提到的问题。
我正在与其他人分享我的经验。
orElse
或orElseGet
,这就是问题所在:
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()));
}
打印
B()...
A
A
orElse
计算B()的值与optional的值是相互依赖的。因此,orElseGet
是懒惰的。
发布于 2017-01-20 03:06:13
我要说的是,当我们想要在else
条件中计算一些东西以获得新值时,orElse
和orElseGet
之间最大的区别就是。
考虑这个简单的例子-
// oldValue is String type field that can be NULL
String value;
if (oldValue != null) {
value = oldValue;
} else {
value = apicall().value;
}
现在,让我们将上面的示例转换为结合使用Optional
和orElse
,
// oldValue is Optional type field
String value = oldValue.orElse(apicall().value);
现在,让我们将上面的示例转换为结合使用Optional
和orElseGet
,
// oldValue is Optional type field
String value = oldValue.orElseGet(() -> apicall().value);
当调用orElse
时,将计算apicall().value
并将其传递给该方法。然而,在orElseGet
的情况下,仅当oldValue
为空时才进行求值。orElseGet
允许延迟计算。
发布于 2018-08-20 22:16:36
考虑以下代码:
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();
}
}
如果我们以这种方式获取value
:Optional.<String>ofNullable(null)
,那么orElseGet()和orElse()之间没有区别,但是如果我们以这种方式获取value
:Optional.<String>ofNullable("test")
,orElseGet()
中的orelesMethod()
将不会被调用,但在orElse()
中将被调用
https://stackoverflow.com/questions/33170109
复制相似问题