带有集合或列表的Java8 CompletableFuture.allOf(…)

带有集合或列表的Java8 CompletableFuture.allOf(…),java,java-8,completable-future,Java,Java 8,Completable Future,Java8有一个函数,它返回一个CompletableFuture,当所有给定的未来完成时,该函数就完成了 然而,我几乎总是不处理CompletableFutures数组,而是有一个列表。当然,我可以使用toArray()方法,但是如果必须在数组和列表之间不断地来回转换,这会有点麻烦 如果有一种巧妙的方法来获得一个CompletableFuture来交换一个列表,而不是不断地创建一个中间数组,那就太好了。有人知道在Java 8中实现这一点的方法吗?不幸的是,据我所知CompletableFutu

Java8有一个函数,它返回一个
CompletableFuture
,当所有给定的未来完成时,该函数就完成了

然而,我几乎总是不处理
CompletableFuture
s数组,而是有一个
列表
。当然,我可以使用
toArray()
方法,但是如果必须在数组和列表之间不断地来回转换,这会有点麻烦


如果有一种巧妙的方法来获得一个
CompletableFuture
来交换一个
列表,而不是不断地创建一个中间数组,那就太好了。有人知道在Java 8中实现这一点的方法吗?

不幸的是,据我所知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())
    );
}
public CompletableFuture allOf(列出未来列表){
完整的未来所有未来结果=
CompletableFuture.allOf(futuresList.toArray(新的CompletableFuture[futuresList.size()]);
返回所有未来结果,然后应用(v->
futuresList.stream()。
映射(future->future.join()。
collect(Collectors.toList())
);
}

发现这一点非常有用:

使用
CompletableFuture.allOf(futuresList.toArray(newcompletablefuture[futuresList.size()])
因为CompletableFuture.allOf()包含一个
CompletableFuture
数组。我不理解将
allOf
join
方法结合使用的好处。您可以直接编写
return futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList())
@OlivierBoissé这是关于异常的。如果您的一个期货异常完成-您的代码将不会等待所有期货的完成。而
allOf
将按预期工作。@OlivierBoissé在编写
时返回futuresList.stream().map(CompletableFuture::join).collect(Collectors.toList())此时您正在等待所有期货的完成。相反,
返回CompletableFuture.allOf(futuresList.toArray(新的CompletableFuture[0]),然后应用(v->futuresList.stream().map(future->future.join()).collect(Collectors.toList())
不等待任何未来,而是返回一个新的未来,该未来将在所有未来完成后与结果列表一起完成。在HotSpot 8上使用
futuresList.toArray(新的CompletableFuture[0])
而不是
futuresList.toArray(新的CompletableFuture[futuresList.size())
。()