CompletableFuture:如何将函数应用于多个CompletableFutures?

时间:2017-03-22 09:01:05

标签: java concurrency java-8 java.util.concurrent completable-future

假设我有3次下载,框架为可完成的期货:

    CompletableFuture<Doc> dl1 = CompletableFuture.supplyAsync(() -> download("file1"));
    CompletableFuture<Doc> dl2 = CompletableFuture.supplyAsync(() -> download("file2"));
    CompletableFuture<Doc> dl3 = CompletableFuture.supplyAsync(() -> download("file3"));

然后所有这些都需要以同样的方式处理

    CompletableFuture<String> s1 = dl1.thenApply(Doc::getFilename);
    CompletableFuture<String> s2 = dl2.thenApply(Doc::getFilename);
    CompletableFuture<String> s3 = dl3.thenApply(Doc::getFilename);

您可以想象要应用多个函数,并行。

根据DRY原则,这个例子似乎不合适。因此,我正在寻找一种解决方案来定义仅执行3次并行执行的工作流程。

如何实现这一目标?

我尝试了allOf,但这有两个问题:1)它开始阻塞; 2)返回类型只能run填充而不是处理它。

1 个答案:

答案 0 :(得分:5)

map

当然,两个List - 调用也可以组合在一起。但至少你不写x次......如果你不喜欢收集到.forEach(System.out::println),你也可以在其上写一些其他内容,例如.forEach。 {{1}}具有以下好处:只要响应可用,就会调用消费者。

或者经典:只需使用循环和列表/数组作为输入,但您可能需要处理比使用流更多的内容