Java 即使Optional包含值,也会调用Optional.orElse的参数

Java 即使Optional包含值,也会调用Optional.orElse的参数,java,java-8,optional,Java,Java 8,Optional,下面的代码打印: 不应该调用 你好,世界 为什么即使我们有一个包含值的可选项,orElse也会被执行 public static void main(String[] args){ String o = Optional.ofNullable("world").map(str -> "hello" + str).orElse(dontCallMe()); System.out.println(o); } private static String dontCallMe(

下面的代码打印:

不应该调用
你好,世界
为什么即使我们有一个包含值的可选项,
orElse
也会被执行

public static void main(String[] args){
    String o = Optional.ofNullable("world").map(str -> "hello" + str).orElse(dontCallMe());
    System.out.println(o);
}

private static String dontCallMe() {
    System.out.println("should Not have called");
    return "why god why";
}
请问,有人能解释一下为什么
orElse
会被执行吗 之后,将执行映射以获得最终结果

使用该方法,无论是否存在包装的值,都将创建默认对象

因此,当您在中调用函数
dontCallMe()
时,将返回字符串值;“不应调用”将打印到控制台

使用instead of将提供您期望的结果,尽管您应该仅在创建默认值的计算成本很高的情况下使用此方法,或者您希望确保在且仅在缺少该值(空可选)的情况下使用此方法,在这种情况下,这是必要的

另一方面,这里不需要使用
Optional.ofNullable
方法,因为前者只应在参数可以为null时使用,后者只应在参数不能为null时使用

作为阅读材料,你可以在贝尔东网站上查看这篇好文章


orElse的
方法如下:

这里没有任何复杂的逻辑

与任何方法一样,它将执行以下操作:

  • 获取传递给方法的所有参数的实际值(包括调用这些参数中的任何方法)
  • 将这些参数传递给方法
  • 执行该方法
事实上,我们并不关心参数的值,这并不会改变这个过程(这只是语言的设计方式,无论好坏)


如果您希望不调用参数中的方法,那么您可能正在查找

这:

仅输出:

helloworld

这里的区别是,我们传递给方法的东西()将保持
()->dontCallMe()
,它不会变成
()->“why-oh-why”
-只有当您调用
get
时,它才会实际评估那里发生的事情,并且
dontCallMe
确实被调用。

很好!建议使用orElseGet作为示例是很好的,但我想补充一些内容。只有当要执行的操作在计算上很昂贵时,才应使用此方法,否则应求助于orElse。关键是,在
orElseGet
中,您提供的是一个
供应商
,该供应商仅在需要时委托创建代码。另一个很好的例子是伐木工人
public static void main(String[] args){
    String o = Optional.ofNullable("world").map(str -> "hello" + str)
                   .orElseGet(() -> dontCallMe());
    System.out.println(o);
}

private static String dontCallMe() {
    System.out.println("should not have called");
    return "why oh why";
}
helloworld