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

Why is CompletableFuture.allOf declared as CompletableFuture<Void>?

为什么 CompletableFuture.allOf 声明为 CompletableFuture<Void> 而不是 return 收集结果或其他东西?我认为制作 CompletableFuture.anyOf return CompletableFuture<Object> 是个好主意,但我看到这两种方法相互关联,所以我对它们 return.[=16= 的内容感到困惑]

anyOf 必须以某种方式告诉您完成触发 anyOf 的特定 CompletableFuture 的结果是什么。在 allOf 的情况下,这不是必需的,因为您知道哪些期货已完成——全部。

allOf(就像 anyOf)不要求所有期货都具有相同的类型。因此,如果它是 return collection 的未来,它必须是 Object 的 collection,这可能不是你想要的。

如果你真的想要 allOf return collection 的未来,那么写你自己的就相当简单了:

public static CompletableFuture<List<Object>> myAllOf(CompletableFuture<?>... futures) {
     return CompletableFuture.allOf(futures)
            .thenApply(x -> Arrays.stream(futures)
                    .map(f -> (Object) f.join())
                    .collect(toList())
            );
}

如果您有此问题的 type-safe 版本并且需要将某种类型的 collection 期货转换为相同类型的 collection 期货,请参阅此几个例子的问题:List<Future> to Future<List> sequence

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