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)
我们假设方法的声明不能改变.
没有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不需要在单独的线程中运行。