为什么总是执行java的orelse块?

ngynwnxp  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(495)

这个问题在这里已经有答案了

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
kg7wmglp

kg7wmglp1#

这个 orElse 部件未执行。你的 getOrElse 方法以将值传递到 orElse 但是当 Optional 评估 orElse 分支未重新运行。
如果你想懒散地评估它,你可以使用 orElseGet 并向其传递方法引用:

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

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()) ).

相关问题