我试图理解Optional<T>. orelse()和Optional<T>. orelseget()方法之间的区别。
orElse()方法的描述是“如果存在则返回值,否则返回other”。
而orElseGet()方法的描述是“如果存在则返回值,否则调用other并返回该调用的结果。”
orElseGet()方法接受一个Supplier函数接口,该接口本质上不接受任何参数并返回T。
在哪种情况下需要使用orElseGet()?如果你有一个方法T myDefault()你为什么不只是做option . orelse (myDefault())而不是option . orelseget (() -> myDefault()) ?
似乎orElseGet()并没有将lambda表达式的执行推迟到以后的某个时间或其他时间,那么它的意义是什么呢?(我认为它会更有用,如果它返回一个更安全的Optional<T>,其get()从不抛出NoSuchElementException, isPresent()总是返回true…但显然不是,它只是像orElse()一样返回T。
还有其他的不同吗?
下面的例子将说明两者的区别:
String destroyTheWorld() {
// destroy the world logic
return "successfully destroyed the world";
}
Optional<String> opt = Optional.of("Save the world");
// we're dead
opt.orElse(destroyTheWorld());
// we're safe
opt.orElseGet(() -> destroyTheWorld());
答案也会出现在文档中。
public T orElseGet(供应商<?延伸T>其他):
如果存在则返回该值,否则调用other并返回
调用的结果。
如果可选选项出现,则供应商将不会被调用。然而,
公共的,其他的
如果存在则返回值,否则返回other。
如果other是一个返回字符串的方法,它将被调用,但如果Optional存在,它的值将不会返回。
它们都用于返回一个可选的默认值,但如果使用一个方法来产生默认值:
orElse:总是执行方法,如果Optional不为空也一样
orElseGet:只在Optional为空时执行它(+性能!)
请看这个例子(类OptionalExample):
public static void main(String[] args) {
Optional<String> optionalNotEmpty = Optional.of("StringVal");
// orElse: getDefaultValue called (useless)
System.out.println(optionalNotEmpty.orElse(getDefaultValue()));
// orElseGet: getDefaultValue not called (better solution)
System.out.println(optionalNotEmpty.orElseGet(OptionalExample::getDefaultValue));
}
public static String getDefaultValue() {
System.out.println("called");
return "default value";
}
输出:
called
StringVal
StringVal
我想说,orElse和orElseGet之间最大的区别是当我们想要在else条件下求值以获得新值时。
考虑这个简单的例子-
// 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()。值被计算并传递给方法。然而,在orElseGet的情况下,只有当oldValue为空时才会计算。orElseGet允许惰性求值。