为什么CompletableFuture.allOf
声明为CompletableFuture<Void>
而不是返回结果集合或其他内容?我认为CompletableFuture.anyOf
return是个好主意CompletableFuture<Object>
,但是我看到这两种方法是相互关联的,所以我对它们返回的内容感到困惑。
问问题
4908 次
2 回答
7
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> 到 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 回答