繁体   English   中英

CompletableFuture:如何将一个功能应用于多个CompletableFuture?

[英]CompletableFuture: How to apply a function to multiple CompletableFutures?

假设我有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次的1个工作流程。

如何做到这一点?

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

Stream.of("file1", "file2", "file3") // or your input in any other format, that can easily be transformed to a stream...
      // .parallel() // well... depends...
      .map(s -> CompletableFuture.supplyAsync(() -> download(s)))
      .map(dl -> dl.thenApply(Doc::getFilename))
      .map(CompletableFuture::join) // if you want to have all the results collected
      .collect(Collectors.toList());

当然,两个map调用也可以合并。 但是至少您不会将所有内容都写x次...如果您不喜欢List的集合,还可以在其上调用其他名称,例如.forEach(System.out::println) .forEach的好处是,只要响应可用,就会立即调用使用者。

还是经典之作:只需在输入中使用循环和列表/数组,但与使用流相比,您可能需要做更多的工作

暂无
暂无

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

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