繁体   English   中英

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

[英]Why is CompletableFuture.allOf declared as CompletableFuture<Void>?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM