如何使用返回CompletionStage的方法thenCombineAsync

时间:2017-03-20 16:18:50

标签: java asynchronous java-8

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

CompletionStage<A> funcA();
CompletionStage<B> funcB();
CompletionStage<C> funcC(A a, B b);

现在我想写一个返回funcD的函数CompletionStage<C>。结果由funcC计算,并且params来自funcAfuncB。现在的问题是如何正确地做到这一点?

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

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

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

1 个答案:

答案 0 :(得分:3)

没有thenComposeWithBoth。如果你不能修改方法签名,我会保持原样(但删除Async - 见下文)。缩短时间的唯一方法是在join()阶段内Combine

funcA()
    .thenCombineAsync(completionStageB, (a,b) -> funcC(a,b).join());

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