在另一个CompletableFuture的结果上应用多个CompletableFuture

让我们举一个例子:我们有四种方法:


CompletableFututre<Void> loadAndApply(SomeObject someObject);

CompletableFuture<SomeData> loadData();

A processA(SomeData data);

B processB(SomeData data);

loadAndApply结合了所有其他方法。loadData长时间获取数据。然后我们将设置someObject.A为运行的结果,processA(data)并将其设置someObject.B为运行的结果。processB(data) 我们不能同时应用这两者processA,processB因为processA它们只能在上运行,swingExecutor并且processB只能在上运行backgroundExecutor。


所以我的问题是:我们可以以某种美观的方式将所有这些方法链接起来吗?


目前,我像这样启动它们:


CompletableFututre<Void> loadAndApply(SomeObject someObject) {

    return loadData()

      .thenApplyAsync(data -> { someObject.setA(processA(data)); return data; }, swingExecutor)

      .thenAcceptAsync(data -> someObject.setB(processB(data)), backgroundExecutor);

}

有什么方法看起来比applyAsync实际上不对给定对象应用任何东西,只是将其返回给下一个未来更好吗?


温温酱
浏览 105回答 1
1回答

胡子哥哥

您可以CompletionStage.thenCompose(Function)与结合使用CompletableFuture.allOf(CompletableFuture...)。由所Function使用的通用签名thenCompose为:Function<? super T, ? extends CompletionStage<U>>。public CompletableFuture<Void> loadAndApply(SomeObject object) {&nbsp; return loadData().thenCompose(data ->&nbsp; &nbsp; &nbsp; CompletableFuture.allOf(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompletableFuture.runAsync(() -> object.setA(processA(data)), swingExecutor),&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CompletableFuture.runAsync(() -> object.setB(processB(data)), backgroundExecutor)&nbsp; &nbsp; &nbsp; ) // End of "allOf"&nbsp; ); // End of "thenCompose"} // End of "loadAndApply"这有一个额外的好处。在您当前正在使用的thenAcceptAsync阶段的代码中,必须等待thenApplyAsync阶段完成才能执行。当同时使用以上两者时setA,它们setB将在各自的执行程序中同时运行。为了方便起见,以下是Javadoc allOf:返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时就完成。如果给定的CompletableFuture中的任何一个异常完成,则返回的CompletableFuture也会执行此操作,并且CompletionException会将此异常作为其原因。否则,给定CompletableFuture的结果(如果有)不会反映在返回的CompletableFuture中,而是可以通过单独检查来获得。如果未提供CompletableFuture,则返回一个CompletableFuture,其值为null。在继续执行程序之前,此方法的应用程序是等待一组独立的CompletableFutures的完成,例如:CompletableFuture.allOf(c1,c2,c3).join();。...以及Javadoc用于thenCompose:返回一个新的CompletionStage,该值以与给定函数返回的CompletionStage相同的值完成。当此阶段正常完成时,将使用该阶段的结果作为参数来调用给定函数,并返回另一个CompletionStage。当该阶段正常完成时,此方法返回的CompletionStage将使用相同的值完成。为了确保进度,提供的功能必须安排其结果的最终完成。此方法类似于Optional.flatMap和Stream.flatMap。有关涵盖异常完成的规则,请参阅CompletionStage文档。注意:CompletableFuture,它实现了CompletionStage,thenCompose但会覆盖,但使返回类型更具体(returnCompletableFuture而不是CompletionStage)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java