带有集合或列表的 Java 8 CompletableFuture.allOf(...) [重复]
Posted
技术标签:
【中文标题】带有集合或列表的 Java 8 CompletableFuture.allOf(...) [重复]【英文标题】:Java 8 CompletableFuture.allOf(...) with Collection or List [duplicate] 【发布时间】:2016-06-19 00:02:06 【问题描述】:Java 8 有一个函数CompletableFuture.allOf(CompletableFuture<?>...cfs)
,它返回一个CompletableFuture
,当所有给定的futures 完成时就完成了。
但是,我几乎总是不处理CompletableFuture
s 的数组,而是处理List<CompletableFuture>
。当然,我可以使用toArray()
方法,但最终不得不在数组和列表之间不断地来回转换有点痛苦。
如果有一种巧妙的方式获得CompletableFuture<List<T>>
以换取List<CompletableFuture<T>>
,那将是非常好的,而不是不断地投入中间数组创建。有谁知道在 Java 8 中执行此操作的方法?
【问题讨论】:
【参考方案1】:不幸的是,据我所知 CompletableFuture 不支持集合。
你可以做这样的事情来使代码更简洁,但它本质上是做同样的事情
public <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> futuresList)
CompletableFuture<Void> allFuturesResult =
CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[futuresList.size()]));
return allFuturesResult.thenApply(v ->
futuresList.stream().
map(future -> future.join()).
collect(Collectors.<T>toList())
);
发现这非常有用:http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html
【讨论】:
使用CompletableFuture.allOf(futuresList.toArray(new CompletableFuture[futuresList.size()]))
,因为 CompletableFuture.allOf() 接受 CompletableFuture
的数组。
我不明白将allOf
与join
方法结合使用的好处。你可以直接写return futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList())
@OlivierBoissé 这是关于例外的。如果您的期货之一异常完成 - 您的代码将不会等待所有期货的完成。而allOf
将按预期工作。
@OlivierBoissé 当你写 return futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList());
时,你正在等待所有期货的完成。相比之下,return CompletableFuture.allOf( futuresList.toArray(new CompletableFuture<?>[0])).thenApply(v -> futuresList.stream() .map(future -> future.join()) .collect(Collectors.<T>toList()) );
不等待任何未来,而是返回一个新的未来,一旦所有未来都完成,它将与结果列表一起完成。
在 HotSpot 8 上使用 futuresList.toArray(new CompletableFuture[0])
而不是 futuresList.toArray(new CompletableFuture[futuresList.size()])
。(***.com/questions/174093/…)以上是关于带有集合或列表的 Java 8 CompletableFuture.allOf(...) [重复]的主要内容,如果未能解决你的问题,请参考以下文章
通过流将带有列表的列表对象转换为Java 8中的映射[重复]
Java并发 - 最好有一个带有锁的线程列表或一个带有请求列表的线程?
从带有流java 8的列表中搜索包含寄存器内部分文本的寄存器[重复]