我是 Java 异步编程新手,并试图了解何时使用 thenCompose() 方法有意义。
考虑以下伪代码:
CompletableFuture<T> firstStep = CompletableFuture.runAsync(firstBlah)
CompletableFuture<T> secondStep = firstStep.thenCompose( secondBlah )
据我了解,第二条语句将导致firstBlah作为可运行对象放入线程池中。一旦任务完成,另一个可运行的将被创建并放入线程池中。
我不明白 thenCompose 如何提高效率。如果执行无论如何都是顺序执行的,为什么我不将 secondaryBlah 合并到firstBlah 函数本身中呢?这样,只需要一个可运行程序。可以消除创建另一个可运行对象并将参数从第一个可运行对象传递到第二个可运行对象的开销。
显然,我错过了一些东西。谢谢。
@SilvioMayolo 和 @AbhijitSarkar 提出了一些精彩的观点。让我简单总结一下,并补充一些。
现在,你是对的 - 如果你已经在构建原始的
CompletableFuture::thenCompose
,那么使用 CompletableFuture
是没有意义的。但就像 @SilvioMayolo 所说,这种方法允许您在将 CompletableFuture
发送出去之前添加“最后一刻的接触”。如果您没有能力修改原始的 CompletableFuture
,那么这是一个很好的方法来 compose 某些功能相互叠加。
CompletableFuture::thenCompose
。我提出这个是因为你的 secondBlah
实际上是 Function<? super T, ? extends CompletionState<U>>
。也就是说,它是一个 Function
,它接收第一个 CompletableFuture<T>
(T output = myCompletableFuture.get();
) 的输出,然后使用返回的 output
构造一个新的 CompletableFuture<U>
。
所以简而言之,当您希望将后续步骤捆绑在同一个
CompletableFuture
中,但不修改原始步骤时,它只不过是一个方便的功能。类似上下文的好例子是 Stream::flatMap
和 Optional::flatMap
。这个功能是必不可少的flatMap
,但是对于CompletableFuture
。这确实有助于保持事物模块化,但在需要的地方进行连接,这符合@AbhijitSarkar 所说的内容。