为什么CompletableFuture.allOf
声明为CompletableFuture<Void>
并且没有返回结果集合或其他内容?我认为让CompletableFuture.anyOf
返回CompletableFuture<Object>
是个好主意,但我看到这两种方法相互关联,所以我对它们返回的内容感到困惑。
答案 0 :(得分:5)
anyOf
必须以某种方式告诉您完成触发CompletableFuture
的特定anyOf
的结果是什么。在allOf
的情况下,这是不必要的,因为您知道哪些期货已经完成 - 所有这些都已完成。
allOf
(正如anyOf
)并不要求所有期货都具有相同的类型。因此,如果要返回集合的未来,它必须是Object
的集合,这可能不是你想要的。
如果你真的希望让allOf
回归收藏的未来,那么编写自己的收藏非常简单:
public static CompletableFuture<List<Object>> myAllOf(CompletableFuture<?>... futures) {
return CompletableFuture.allOf(futures)
.thenApply(x -> Arrays.stream(futures)
.map(f -> (Object) f.join())
.collect(toList())
);
}
如果您有此问题的类型安全版本,并且需要将某种类型的期货集合转换为该类型集合的未来,请参阅此问题以获取以下几个示例:List<Future> to Future<List> sequence
答案 1 :(得分:0)
这与Misha的答案类似,但具有通用类型:
public class Futures {
public static <T> CompletableFuture<List<T>> all(List<CompletableFuture<T>> futures) {
CompletableFuture<Void> cfv = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
return cfv.thenApply(future -> {
return futures.stream()
.map(completableFuture -> completableFuture.join())
.collect(Collectors.toList());
});
}
}
这是Java API应该提供的方法。