以下是我目前的发现:
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();
}
在这里,如果不复制Map器或声明另一个局部变量,我就不能将某个Map函数链接到末尾,所有这些都使得代码比实际要解决的问题更复杂。
我更愿意这样写:
return firstChoice().alternatively(secondChoice());
但是可选的::显然不存在。现在怎么办?
9条答案
按热度按时间zy1mlcev1#
你可以简单地把它替换成
除非 firstChoice.isPresent() 为false,否则上面的代码不会调用。
但是你必须准备好调用这两个函数来得到你想要的输出。没有其他的方法来逃避检查。
8xiog9wr2#
下面是@marstran解决方案对任意数量期权的推广:
试验:
输出:
dfty9e193#
我对java 8不支持这一点感到非常沮丧,于是我切换回guava的可选函数,它有
or
:如果此可选项存在值,则返回它;否则为第二选择。
uttx8gqw4#
Java 9为这种情况添加了
Optional.or(Supplier<? extends Optional<? extends T>> supplier)
方法。给定方法
firstChoice()
和secondChoice()
,它们都返回Optional<Foo>
,下面的一行程序使用Optional.or
来获得所需的结果:这种方法还有一个额外的好处,即只在
firstChoice
为空时计算secondChoice
。dfuffjeb5#
惰性计算和任意数量的
Optional
元素x8goxv8g6#
使用Java11,您可以简单地执行
firstChoice().or(this::secondChoice)
bkkx9g8r7#
以下是一种适用于流API中任意数量的
Optional
的方法:这不是最短的一个,但更明白易懂。
另一种方法是使用commons-lang的Guava中的
firstNonNull()
,如果你已经在使用其中一个库的话:6yoyoihd8#
试试这个:
map方法给你一个
Optional<Optional<Foo>>
,然后orElseGet
方法把它扁平化回Optional<Foo>
,secondChoice
方法只有在firstChoice()
返回空的可选值时才会被计算。rt4zxlrg9#
也许是这样的:
出发地:Chaining Optionals in Java 8