这个问题在这里已经有答案了:
optional.orelse()
和optional.orelseget()
之间的差异(8个答案)
当我需要在optional.orelse()上使用optional.orelseget()时(3个答案)
18天前关门了。
我在玩java的optional,并认为它的工作原理类似于if-else块。但在下面的代码中即使 name
变量不是 null
的内容 orElse
block get被执行了。有什么解释吗?
import java.util.Optional;
class Scratch {
public static void main(String[] args) {
String name = "some text";
System.out.println(
Optional.ofNullable(name)
.map(n -> mapped())
.orElse(getOrElse()));
}
static String mapped(){
System.out.println("mapped -- block executed");
return "mapped";
}
static String getOrElse(){
System.out.println("orElse -- block executed");
return "orElse";
}
}
输出:
mapped -- block executed
orElse -- block executed
mapped
2条答案
按热度按时间kg7wmglp1#
这个
orElse
部件未执行。你的getOrElse
方法以将值传递到orElse
但是当Optional
评估orElse
分支未重新运行。如果你想懒散地评估它,你可以使用
orElseGet
并向其传递方法引用:db2dz4w82#
仔细看看
Optional.orElse(T)
. 它接受一个需要提供给该调用的值,但该值只在else情况下返回。所以呢getOrElse()
将被执行以在任何情况下获取该值。Optional.orElse(T)
通常与现有值一起使用,例如:map(e -> mapped()).orElse("not found")
如果您想使用一个只在else情况下调用的函数,则需要使用Optional.orElseGet(Supplier<? extends T>)
这样地:map(e -> mapped).orElseGet(Scratch::getOrElse)
(或orElseGet(() -> getOrElse())
).