![](/img/trans.png)
[英]Java completableFuture: how to parallelize several CompletableFutures
[英]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.