假设我有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
填充而不是处理它。
答案 0 :(得分:5)
map
当然,两个List
- 调用也可以组合在一起。但至少你不写x次......如果你不喜欢收集到.forEach(System.out::println)
,你也可以在其上写一些其他内容,例如.forEach
。 {{1}}具有以下好处:只要响应可用,就会调用消费者。
或者经典:只需使用循环和列表/数组作为输入,但您可能需要处理比使用流更多的内容