首页 > 解决方案 > 如何转换收藏> 到 CompletableFuture> 无需调用加入或获取?

问题描述

给定一组期货

final Collection<CompletableFuture<X>> futures = ...;
final CompletableFuture<Collection<X>> joined = ???

如何在不调用的情况下为所有值组合在一起的集合创造未来join

标签: javaconcurrencycompletable-future

解决方案


解决方案是

  1. 转换Collection<CompletableFuture<X>>Collection<CompletableFuture<Collection<X>>>
  2. CompletableFuture.completedFuture(Collections.emptyList()) 使用作为初始值减少此集合。
final CompletableFuture<Collection<X>> joined = 
                futures
                .stream()
                .map(f -> f.thenApply(value -> (Collection<X>)Collections.singletonList(value)))
                .reduce(
                        CompletableFuture.completedFuture(Collections.emptyList()), 
                        (f, g) -> 
                            f.thenCompose(
                                xs -> g.thenApply(
                                     ys -> Stream
                                               .of(xs, ys)
                                               .flatMap(Collection::stream)
                                               .collect(Collectors.toList()))
                                )
                            );

推荐阅读