为什么 java 的 orElse 块总是被执行?

for*_*hun 0 java lambda function optional

我在玩 Java 的 Optional 并认为它就像一个 if else 块。但是在下面的代码中,即使name变量不是执行块null的内容orElse。有什么解释吗?

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";
  }
}

Run Code Online (Sandbox Code Playgroud)

输出:

mapped -- block executed
orElse -- block executed
mapped
Run Code Online (Sandbox Code Playgroud)

Tho*_*mas 5

仔细看看Optional.orElse(T)。它需要一个将提供给该调用哪个需求,但该值将只返回在其他情况下。SogetOrElse()将被执行以在任何情况下获取该值。

Optional.orElse(T) 通常与已经存在的值一起使用,例如: map(e -> mapped()).orElse("not found")

如果你想使用一个只会在 else 情况下被调用的函数,你需要Optional.orElseGet(Supplier<? extends T>)像这样使用:(map(e -> mapped).orElseGet(Scratch::getOrElse)orElseGet(() -> getOrElse()))。