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

时间:2017-04-23 15:30:15

标签: java java-8 optional nullable

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

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

使用Optional,我并不意味着将SOME_OBJECT == null替换为Optional.ofNullable(SOME_OBJECT).isPresent(),这比仅仅检查是否为null更长的语法。

我期望的是:

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

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

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

3 个答案:

答案 0 :(得分:8)

正如本Blog Article中提到的那样,Optionals会在Java 9 void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction);中获得一个新的Methode,所以对于Java 8,你现在还没有这样的东西。

答案 1 :(得分:2)

如上所述,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");
});

答案 2 :(得分:2)

正如BdoubleB97(Bdubzz)所说,Java 9将实现Optional#ifPresentOrElse,如果Consumer<T>存在,将Optional<T>采用RunnableOptional<T>如果public <T> void ifPresentOrElse(Optional<T> optional, Consumer<? super T> action, Runnable emptyAction) { if (optional.isPresent()) { action.accept(optional.get()); } else { emptyAction.run(); } } 为空,则会执行。

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

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
</Project>