8

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

4

2 回答 2

7

anyOfCompletableFuture必须以某种方式告诉您触发完成的特定结果是什么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> 到 Future<List> 序列

于 2015-12-04T08:37:46.897 回答
1

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

于 2020-08-22T20:17:08.853 回答