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

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

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

最佳答案

尝试这个:

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

map方法为您提供了Optional<Optional<Foo>>。然后,orElseGet方法将其变平为Optional<Foo>。仅当secondChoice返回空的optional时,才会评估firstChoice()方法。

10-07 17:01