Estoy trabajando en una aplicación Java 8. Tengo 3 métodos que devuelven CompletionStage:
CompletionStage<Edition> editionService.loadById(editionId);
CompletionStage<Event> eventService.loadById(eventId);
CompletionStage<List<EditionDate>> editionDateService.loadByEditionId(editionId);
Y un método que consolida estos valores en un resultado
CompletionStage<Result> getResult(Edition edition, Event event, List<EditionDate> editionDates)
Los métodos 1 y 3 se pueden corrieron de forma independiente pero el método de llamar 2 depende del resultado del método 1. Y, obviamente, el método 4 depende de todos ellos para funcionar. Mi pregunta es, ¿cuál es la mejor manera de llamar a estos métodos que utilizan CompletableFuture API; esto es lo mejor que puedo llegar a pero no estoy seguro de que es la mejor manera de hacerlo:
editionService.loadById(editionId)
.thenCompose(edition -> eventService.loadById(edition.getEventId()))
.thenCombine(editionDateService.loadByEditionId(editionId),
(event, editionDates) -> getResult(edition, event, editionDates) );
Pero de esta manera no tengo acceso a mi edition
resultado, así que estoy en un poco de una pérdida. Cualquier método que debería usar que no estoy tomando en cuenta?
Se puede escribir como
CompletionStage<Result> result = editionService.loadById(editionId)
.thenCompose(edition -> eventService.loadById(edition.getEventId())
.thenCombine(editionDateService.loadByEditionId(editionId),
(event, editionDates) -> getResult(edition, event, editionDates) ) )
.thenCompose(Function.identity());
pero luego, editionDateService.loadByEditionId
se activará sólo después de editionService.loadById
que se haya completado, lo cual es una dependencia innecesaria.
La solución más simple es no tratar de escribir todo como una sola expresión:
CompletionStage<List<EditionDate>> datesStage=editionDateService.loadByEditionId(editionId);
CompletionStage<Result> result = editionService.loadById(editionId)
.thenCompose(edition -> eventService.loadById(edition.getEventId())
.thenCombine(datesStage, (event, dates) -> getResult(edition, event, dates)) )
.thenCompose(Function.identity());