为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

温温酱 2021-05-26 09:13:50
让我们举一个例子:我们有四种方法: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实际上不对给定对象应用任何东西,只是将其返回给下一个未来更好吗?
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您可以CompletionStage.thenCompose(Function)与结合使用CompletableFuture.allOf(CompletableFuture...)。由所Function使用的通用签名thenCompose为:Function<? super T, ? extends CompletionStage<U>>。


public CompletableFuture<Void> loadAndApply(SomeObject object) {

  return loadData().thenCompose(data ->

      CompletableFuture.allOf(

          CompletableFuture.runAsync(() -> object.setA(processA(data)), swingExecutor),

          CompletableFuture.runAsync(() -> object.setB(processB(data)), backgroundExecutor)

      ) // End of "allOf"

  ); // 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)。


查看完整回答
反对 回复 2021-05-26
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信