【问题标题】:Java 8 CompletableFuture.allOf(...) with Collection or List [duplicate]带有集合或列表的 Java 8 CompletableFuture.allOf(...) [重复]
【发布时间】: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 中执行此操作的方法?

【问题讨论】:

    标签: java java-8 completable-future


    【解决方案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()])。(stackoverflow.com/questions/174093/…)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2016-07-11
    相关资源
    最近更新 更多