我找不到使用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的架构师故意阻止这种语法......
正如在这个Blog Article中所提到的,Optionals将在Java 9中使用Java 8 void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction);
获得一个新的Methode,所以在Java 8中你目前没有这样的东西。
正如BdoubleB97(Bdubzz)所述,Java 9将实现Optional#ifPresentOrElse
,它将采用Consumer<T>
,如果Optional<T>
存在将被应用,以及Runnable
将在Optional<T>
为空时执行。
您可以立即更新到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();
}
}
正如所说的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");
});