我有3个返回CompletionStage
的函数。让我们说它们看起来像:
CompletionStage<A> funcA();
CompletionStage<B> funcB();
CompletionStage<C> funcC(A a, B b);
现在我想写一个返回funcD
的函数CompletionStage<C>
。结果由funcC
计算,并且params来自funcA
和funcB
。现在的问题是如何正确地做到这一点?
我阅读文档后的尝试看起来像这样,但我不确定它是否正确使用。问题是在thenCombineAsync
之后我收到CompletionStage<CompletionStage<C>>
并且最后一行看起来像丑陋的解决方法以提取正确的结果。可以做得更好吗?
CompletionStage<C> funcD() {
CompletionStage<B> completionStageB = funcB();
return funcA()
.thenCombineAsync(completionStageB, (a,b) -> funcC(a,b))
.thenComposeAsync(result -> result);
}
让我们假设方法的声明不能改变。
答案 0 :(得分:3)
没有thenComposeWithBoth
。如果你不能修改方法签名,我会保持原样(但删除Async
- 见下文)。缩短时间的唯一方法是在join()
阶段内Combine
:
funcA()
.thenCombineAsync(completionStageB, (a,b) -> funcC(a,b).join());
另外,您不必要地使用...Async
方法。由于funcC
返回CompletableFuture
,因此可能不会长时间运行,也不需要异步安排它。并且result -> result
当然不需要在单独的线程中运行。