Estoy buscando una manera de no bloqueo para resumir una corriente de CompleteableFuture<BigDecimal>
.
Ya he encontrado temas estrechamente relacionados con este problema, al igual que este . Pero, lamentablemente, en mi caso tengo el BigDecimal
todo en un CompleteableFuture y por lo tanto tengo que esperar a la finalización primero. Al final me gustaría tener otra CompleteableFuture que contiene la suma de todos los futuros dentro de la corriente, una vez que se ha completado.
EDIT: En realidad, yo se las arregló para encontrar la siguiente solución:
Stream<CompletableFuture<BigDecimal>> lotOfWork;
CompletableFuture.supplyAsync(() -> lotOfWork.map(CompletableFuture::join)
.reduce(
BigDecimal.valueOf(0.0),
BigDecimal::add
)
);
Pero como esto no está usando cualquiera de los CompletionStage métodos, estoy bastante seguro de que hay una mejor manera de hacer este trabajo.
Aquí está la solución con el CompletableFuture :: thenCombine según lo sugerido por usted directamente
Tendría que prefieren una solución que no hace cumplir la orden de reducción, pero no lo encuentras en el Javadoc.
CompletableFuture<BigDecimal> result = lotOfWork.reduce((a,b) -> a.thenCombine(b, BigDecimal::add)).orElse(CompletableFuture.completedFuture(BigDecimal.ZERO));