带有Collection或List的Java 8 CompletableFuture.allOf(...)

the*_*ica 44 java java-8 completable-future

Java 8有一个函数CompletableFuture.allOf(CompletableFuture<?>...cfs),它返回一个CompletableFuture在所有给定的期货完成时完成的函数.

但是,我几乎总是不处理一个CompletableFutures 数组,而是有一个List<CompletableFuture>.当然,我可以使用这种toArray()方法,但是这必须经常在数组和列表之间来回转换,这有点痛苦.

如果有一个光滑的方式来CompletableFuture<List<T>>换取a List<CompletableFuture<T>>,而不是经常不得不投入中间数组创建,那将是非常好的.有没有人知道在Java 8中这样做的方法?

Dee*_*pak 32

不幸的是,据我所知,可完成的期货不支持收藏.

你可以做这样的事情来使代码更清洁,但它基本上做同样的事情:

public <T> CompletableFuture<List<T>> allOf(List<CompletableFuture<T>> futuresList) {
    CompletableFuture<Void> allFuturesResult =
    CompletableFuture.allOf(futuresList.toArray());
    return allFuturesResult.thenApply(v ->
            futuresList.stream().
                    map(future -> future.join()).
                    collect(Collectors.<T>toList())
    );
}
Run Code Online (Sandbox Code Playgroud)

发现这个非常有用的信息:http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

  • @OlivierBoissé,当您编写“return futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList());”时,您此时正在等待所有 future 的完成。相反,`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()) );` 不会等待任何 future,而是返回一个新的 future,一旦所有 future 完成,该新 future 将与结果列表一起完成。 (14认同)
  • 我不明白将`allOf`与`join`方法结合使用的好处.你可以直接写`return futuresList.stream().map(CompletableFuture :: join).collect(Collectors.toList())` (10认同)
  • 使用`CompletableFuture.allOf(futuresList.toArray(new CompletableFuture [futuresList.size()]))`因为CompletableFuture.allOf()接收一个`CompletableFuture`数组. (9认同)
  • @OlivierBoissé这是关于例外的内容。如果您的某一期货完成但没有例外-您的代码将不会等待所有期货的完成。虽然`allOf`将按预期工作。 (2认同)
  • 在 HotSpot 8 上使用 `futuresList.toArray(new CompletableFuture[0])` 而不是 `futuresList.toArray(new CompletableFuture[futuresList.size()])`。 (/sf/ask/12186541/ myclass0-或-toarraynew-myclassmylist-size) (2认同)