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

2022-09-01 00:04:06

以下是我到目前为止所得到的:

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

这让我感到既可怕又浪费。如果第一选择存在,我就会不必要地计算第二选择。

还有一个更高效的版本:

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

在这里,我无法在不复制映射器或声明另一个局部变量的情况下将某些映射函数链接到末尾。所有这些都使代码比正在解决的实际问题更复杂。

我宁愿写这个:

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

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


答案 1

试试这个:

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

映射方法为您提供了 .然后,该方法将其平展回 .仅当返回空可选项时,才会计算该方法。Optional<Optional<Foo>>orElseGetOptional<Foo>secondChoicefirstChoice()


答案 2

也许是这样的:

Optional<String> finalChoice = Optional.ofNullable(firstChoice()
    .orElseGet(() -> secondChoice()
    .orElseGet(() -> null)));

来自: Java 8 中的链接可选


推荐