Как удобно суммировать поток CompleteableFuture <BigDecimal>? - PullRequest
6 голосов
/ 26 апреля 2019

Я ищу неблокирующий способ суммировать поток CompleteableFuture<BigDecimal>.

Я уже нашел темы, тесно связанные с этой проблемой, например this . Но, к сожалению, в моем случае BigDecimal упакован в CompleteableFuture, и поэтому мне нужно сначала дождаться завершения. В конце я хотел бы получить еще одно CompleteableFuture, содержащее сумму всех фьючерсов в потоке после его завершения.

EDIT: На самом деле мне удалось найти следующее решение:

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

Но поскольку здесь не используется ни один из CompletionStage методов, я уверен, что есть еще лучший способ сделать эту работу.

1 Ответ

1 голос
/ 26 апреля 2019

Вот решение с CompletableFuture :: thenCombine, предложенное вами напрямую

Я бы предпочел решение, которое не применяет порядок сокращения, но не нашло его в javadoc.

CompletableFuture<BigDecimal> result = lotOfWork.reduce((a,b) -> a.thenCombine(b, BigDecimal::add)).orElse(CompletableFuture.completedFuture(BigDecimal.ZERO));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...