为什么CompletableFuture.allOf声明为CompletableFuture <void>?

时间:2015-12-04 08:09:07

标签: java concurrency java-8 completable-future

为什么CompletableFuture.allOf声明为CompletableFuture<Void>并且没有返回结果集合或其他内容?我认为让CompletableFuture.anyOf返回CompletableFuture<Object>是个好主意,但我看到这两种方法相互关联,所以我对它们返回的内容感到困惑。

2 个答案:

答案 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应该提供的方法。