如何使用在thenCombineAsync中返回CompletionStage的方法

Jak*_*Ch. 5 java asynchronous java-8

我有3个函数返回CompletionStage.让我们说它们看起来像:

CompletionStage<A> funcA();
CompletionStage<B> funcB();
CompletionStage<C> funcC(A a, B b);
Run Code Online (Sandbox Code Playgroud)

现在我想写funcD回归的功能CompletionStage<C>.结果由funcC和来自两个funcA和来自的params 计算funcB.现在的问题是如何正确地做到这一点?

我阅读文档后的尝试看起来像这样,但我不确定它是否正确使用.问题是thenCombineAsync我收到后CompletionStage<CompletionStage<C>>,最后一行看起来像丑陋的解决方法,以提取适当的结果.可以做得更好吗?

CompletionStage<C> funcD() {
    CompletionStage<B> completionStageB = funcB();
    return funcA()
        .thenCombineAsync(completionStageB, (a,b) -> funcC(a,b))
        .thenComposeAsync(result -> result);
}
Run Code Online (Sandbox Code Playgroud)

我们假设方法的声明不能改变.

Mis*_*sha 3

没有thenComposeWithBoth。如果您无法修改方法签名,我将保留其原样(但删除Async- 见下文)。缩短这个时间的唯一方法是进入舞台join()内部Combine

funcA()
    .thenCombineAsync(completionStageB, (a,b) -> funcC(a,b).join());
Run Code Online (Sandbox Code Playgroud)

另一方面,您...Async不必要地使用了方法。由于您funcC返回 a CompletableFuture,因此它可能不会长时间运行,并且无需异步安排它。当然result -> result不需要在单独的线程中运行。