我正在使用Java 8应用程序。我有3个返回CompletionStage的方法:

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

  • 以及将这些值合并为结果的方法
  • CompletionStage<Result> getResult(Edition edition, Event event, List<EditionDate> editionDates)

  • 方法1和3可以独立运行,但是方法2的调用取决于方法1的结果。显然,方法4取决于所有方法的运行。我的问题是,使用CompletableFuture api调用这些方法的最佳方法是什么?这是我能想到的最好的方法,但是我不确定这是最好的方法:
    editionService.loadById(editionId)
      .thenCompose(edition -> eventService.loadById(edition.getEventId()))
      .thenCombine(editionDateService.loadByEditionId(editionId),
                  (event, editionDates) -> getResult(edition, event, editionDates) );
    

    但是这样一来,我无法访问自己的edition结果,所以我有点茫然。我应该考虑使用的任何方法吗?

    最佳答案

    你可以写成

    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());
    

    但是,只有在editionDateService.loadByEditionId完成后才触发editionService.loadById,这是不必要的依赖关系。

    最简单的解决方案是不要尝试将所有内容都编写为单个表达式:
    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());
    

    09-27 14:22