繁体   English   中英

Java Optional可以用于流量控制吗?

[英]Can Java Optional be used for flow control?

我找不到使用Java的Optional执行以下操作的方法:

if (SOME_OBJECT != null) {
  doSomething(SOME_OBJECT);
} else {
  doSomethingElse();
}

通过使用Optional ,我的意思并不是说使用Optional.ofNullable(SOME_OBJECT).isPresent()替换SOME_OBJECT == null ,这比仅仅检查null是否更长。

我期望的是:

Optional.ofNullable(SOME_OBJECT)
  .ifPresent(this::doSomething)
  .orElse(this::doSomethingElse);

我找不到像我刚写的那样的API。 它存在吗? 如果是这样,它是什么? 如果没有,为什么不呢? :)

第二段代码看起来像一个反模式:(为什么?也许Java的架构师故意阻止这种语法......

正如本博客文章中提到的,Optionals将在Java 9中获得一个新的Methode void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction); 所以使用Java 8,你现在还没有这样的东西。

正如所说的Java 8没有一个完全按照你想要的结构。

我知道,它很难看,远不如简单的if / then / else可读,但你可以这样做:

Optional.ofNullable(someObject)
        .map(obj -> {
            System.out.println("present");
            return obj;
          })
        .orElseGet(() -> {
            System.out.println("not present");
            return null;
          });

唯一的副作用是你总是返回一些东西。
或者另一方面,你可以干净利落地处理案件isPresent()

Optional.ofNullable(someObject).ifPresent(obj -> {
  System.out.println("present");
});

正如BdoubleB97(Bdubzz)所述,Java 9将实现Optional#ifPresentOrElse ,如果Optional<T>存在,将使用Consumer<T> ,如果Optional<T>为空,将执行Runnable

您可以立即更新到Java 9 Early Access版本,也可以使用以下内容自行构建方法:

public <T> void ifPresentOrElse(Optional<T> optional, Consumer<? super T> action, Runnable emptyAction) {
    if (optional.isPresent()) {
        action.accept(optional.get());
    } else {
        emptyAction.run();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM