我有两个函数,每个函数返回CompletebleFuture<Boolean>
个实例,我希望or
将它们组合成一个有序且短路的未来。
public CompletableFuture<Boolean> doA();
public CompletableFuture<Boolean> doB();
非未来代码(即仅返回布尔值)将只是
return doA() || doB();
使用Futures我已经达到了这一点,当返回类型是CompletableFuture<CompletableFuture<Boolean>>
实例时。
doA.thenApply(b -> {
if (!b) {
return doB();
} else {
return CompletableFuture.completedFuture(b);
}
}
有没有办法压扁这个?或者,我可以以任何方式返回CompletablyFuture<Boolean>
编辑:注意,能够将期货短路是我想要的功能。我知道我正在连续运行计算,但没关系。当<{1}}返回true时, 不 想要运行doB
。
答案 0 :(得分:2)
只需使用方法thenCompose
代替thenApply
:
CompletableFuture<Boolean> result = doA().thenCompose(b -> b
? CompletableFuture.completedFuture(Boolean.TRUE) : doB());
答案 1 :(得分:0)
如果嵌套将来的创建超出了您的控制范围,则可以像下面这样将其展平:
static <T> CompletableFuture<T> flatten(
CompletableFuture<CompletableFuture<T>> nestedFuture) {
return nestedFuture.thenCompose(Function.identity());
}