78

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

但是,我几乎总是不处理CompletableFutures 数组,而是处理List<CompletableFuture>. 当然,我可以使用该toArray()方法,但最终不得不在数组和列表之间不断地来回转换有点痛苦。

如果有一种巧妙的方法来CompletableFuture<List<T>>换取 a List<CompletableFuture<T>>,而不是不断地投入中间数组创建,那将是非常好的。有谁知道在 Java 8 中执行此操作的方法?

4

1 回答 1

66

不幸的是,据我所知 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

于 2016-03-05T04:11:43.120 回答