如何总结CompleteableFuture的流 方便?

问题描述 投票:6回答:1

我正在寻找一种非阻塞方式来总结CompleteableFuture<BigDecimal>的流。

我已经找到了与这个问题密切相关的话题,比如this。但不幸的是,在我的情况下,我确实将BigDecimal打包成一个CompleteableFuture,因此我需要先等待完成。最后,我想获得另一个CompleteableFuture,其中包含Stream中所有Futures的总和,一旦完成。

编辑:其实我确实设法找到以下解决方案:

Stream<CompletableFuture<BigDecimal>> lotOfWork;
CompletableFuture.supplyAsync(() -> lotOfWork.map(CompletableFuture::join)
                                             .reduce(
                                                 BigDecimal.valueOf(0.0), 
                                                 BigDecimal::add
                                              )
);

但由于这不使用任何CompletionStage方法,我很确定有更好的方法来完成这项工作。

java asynchronous java-stream
1个回答
1
投票

以下是您直接建议的CompletableFuture :: thenCombine解决方案

我宁愿选择一种不强制执行减少顺序但却没有在javadoc中找到它的解决方案。

CompletableFuture<BigDecimal> result = lotOfWork.reduce((a,b) -> a.thenCombine(b, BigDecimal::add)).orElse(CompletableFuture.completedFuture(BigDecimal.ZERO));
© www.soinside.com 2019 - 2024. All rights reserved.