展平Java期货

时间:2014-04-25 20:14:09

标签: java java-8 future

我有两个函数,每个函数返回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

2 个答案:

答案 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());
}