¿Cómo acceder a todos los resultados anteriores en la cadena CompletionStage CompletableFuture

Daniel Calderón Mori:

Estoy trabajando en una aplicación Java 8. Tengo 3 métodos que devuelven CompletionStage:

  1. CompletionStage<Edition> editionService.loadById(editionId);
  2. CompletionStage<Event> eventService.loadById(eventId);
  3. CompletionStage<List<EditionDate>> editionDateService.loadByEditionId(editionId);

Y un método que consolida estos valores en un resultado

  1. 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 editionresultado, así que estoy en un poco de una pérdida. Cualquier método que debería usar que no estoy tomando en cuenta?

Holger:

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.loadByEditionIdse activará sólo después de editionService.loadByIdque 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());

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=208382&siteId=1
Recomendado
Clasificación