带有集合或列表的 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 完成时就完成了。

但是,我几乎总是不处理CompletableFutures 的数组,而是处理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 的数组。 我不明白将allOfjoin 方法结合使用的好处。你可以直接写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&lt;?&gt;[0])).thenApply(v -&gt; futuresList.stream() .map(future -&gt; future.join()) .collect(Collectors.&lt;T&gt;toList()) ); 不等待任何未来,而是返回一个新的未来,一旦所有未来都完成,它将与结果列表一起完成。 在 HotSpot 8 上使用 futuresList.toArray(new CompletableFuture[0]) 而不是 futuresList.toArray(new CompletableFuture[futuresList.size()])。(***.com/questions/174093/…)

以上是关于带有集合或列表的 Java 8 CompletableFuture.allOf(...) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

通过流将带有列表的列表对象转换为Java 8中的映射[重复]

如何使用流将列表转换为带有索引的地图 - Java 8?

Java并发 - 最好有一个带有锁的线程列表或一个带有请求列表的线程?

从带有流java 8的列表中搜索包含寄存器内部分文本的寄存器[重复]

JPQL IN 子句:Java 数组(或列表、集合...)?

如何在java 8中将字符串排序为带有lambdas的int