2016-03-05 671 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