【问题标题】:Why orElse block of java always get executed? [duplicate]为什么 java 的 orElse 块总是被执行? [复制]
【发布时间】:2020-12-22 07:07:21
【问题描述】:

我正在使用 Java 的 Optional,并认为它的工作方式类似于 if else 块。但是在下面的代码中,即使name 变量不是nullorElse 块的内容也会被执行。有什么解释吗?

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

【问题讨论】:

    标签: java function lambda optional


    【解决方案1】:

    仔细查看Optional.orElse(T)。它需要一个 value 需要提供给该调用,但该值只会在 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()))。

    【讨论】:

      【解决方案2】:

      orElse 部分没有被执行。正在执行您的 getOrElse 方法,以便将值传递给 orElse,但是当评估 Optional 时,orElse 分支不会重新运行。

      如果你想懒惰地评估它,你可以使用orElseGet 并传递一个方法引用给它:

      Optional.ofNullable(name)
          .map(n -> mapped())
          .orElseGet(Scratch::getOrElse));
      

      【讨论】:

        猜你喜欢
        • 2016-02-04
        • 1970-01-01
        • 2011-03-14
        • 2020-12-26
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        相关资源
        最近更新 更多