2016-03-05 672 views
20

Java 8的函數CompletableFuture.allOf(CompletableFuture<?>...cfs)返回CompletableFuture,該函數在所有給定期貨完成時完成。Java 8 CompletableFuture.allOf(...)帶收集或列表

但是,我幾乎總是不處理CompletableFuture s的數組,而是有一個List<CompletableFuture>。當然,我可以使用toArray()方法,但是最後不得不在陣列和列表之間來回轉換,這有點痛苦。

這將是非常好的,如果有一個光滑的方式得到CompletableFuture<List<T>>換回List<CompletableFuture<T>>,而不是不斷地不得不拋出中介陣列創建。有沒有人知道在Java 8中執行此操作的方法?

回答

12

不幸的是,據我所知,完整的期貨不支持集合。

你可以做這樣的事情使代碼有點清潔,但它本質上是做同樣的事情:

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()) 
    ); 
} 

發現這個非常翔實:http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html

+3

使用'CompletableFuture.allOf(futuresList。 toArray(new CompletableFuture [futuresList.size()]))'因爲CompletableFuture.allOf()需要一個'CompletableFuture'數組。 – wz366

+1

@ wz366這個工程,但我得到IntelliJ警告'new CompletableFuture [futuresList.size()]'說'預期類型的​​對象數組[]''''' – Kousha