到目前为止,这是我得到的:
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()
方法。