到目前为止,这是我得到的:
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());
但是可选:::显然不存在。怎么办?
试试这个:
firstChoice().map(Optional::of) .orElseGet(this::secondChoice);
map方法为您提供了一个Optional<Optional<Foo>>。然后,该orElseGet方法将其展平为Optional<Foo>。secondChoice仅当firstChoice()返回空的可选参数时,才会评估该方法。
Optional<Optional<Foo>>
orElseGet
Optional<Foo>
secondChoice
firstChoice()