gpt4 book ai didi

java - 如何访问 CompletableFuture 链中所有先前的 CompletionStage 结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:19 27 4
gpt4 key购买 nike

我在 Java 8 应用程序中工作。我有 3 个返回 CompletionStage 的方法:

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

以及将这些值合并为结果的方法

  1. CompletionStage<Result> getResult(Edition edition, Event event, List<EditionDate> editionDates)

方法一和方法三可以独立运行,但是方法二的调用依赖于方法一的结果,显然方法四依赖于它们全部运行。我的问题是,使用 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());

关于java - 如何访问 CompletableFuture 链中所有先前的 CompletionStage 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54919757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com