为什么 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 应该提供的方法。
为什么 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 应该提供的方法。