一尘不染

组合可选项的最优雅方法是什么?

java

到目前为止,这是我得到的:

Optional<Foo> firstChoice = firstChoice();
Optional<Foo> secondChoice = secondChoice();
return Optional.ofNullable(firstChoice.orElse(secondChoice.orElse(null)));

这让我既震惊又浪费。如果存在firstChoice,则我将不必要地计算secondChoice。

还有一个更有效的版本:

Optional<Foo> firstChoice = firstChoice();
if(firstChoice.isPresent()) {
 return firstChoice;
} else {
 return secondChoice();
}

在这里,如果不复制映射器或声明另一个局部变量,就无法将某些映射函数链接到最后。所有这些使代码比要解决的实际问题更加复杂。

我宁愿这样写:

return firstChoice().alternatively(secondChoice());

但是可选:::显然不存在。怎么办?


阅读 206

收藏
2020-12-03

共1个答案

一尘不染

试试这个:

firstChoice().map(Optional::of)
             .orElseGet(this::secondChoice);

map方法为您提供了一个Optional<Optional<Foo>>。然后,该orElseGet方法将其展平为Optional<Foo>secondChoice仅当firstChoice()返回空的可选参数时,才会评估该方法。

2020-12-03