java CompletableFuture.thenCombine返回CompletableFuture的CompletableFuture

时间:2018-01-09 08:30:22

标签: java parallel-processing nonblocking chaining completable-future

我的应用程序中有3种不同的方法。所有人都在返回CompletableFuture<SomeType>。我想并行执行方法1和2。完成方法1和2后,我想用方法1和2的参数触发方法3返回值。

代码示例:

CompletableFuture<Request> future1 = RequestConverter.Convert(requestDto);
CompletableFuture<String> future2 = tokenProvider.getAuthToken();

CompletableFuture<CompletableFuture<String>> future3 = 
future1.thenCombine(future2,(request,token) -> 
requestProcessor.Process(request,token)); 

但上述代码的问题在于我得到CompletableFuture CompletableFuture。我想避免这种情况,并且在没有阻止的情况下得到一个简单的CompletableFuture<String>。这可能吗?

2 个答案:

答案 0 :(得分:3)

假设你有class Pair<L, R> { public final L left; public final R right; public Pair(L left, R right) { this.left = left; this.right = right; } } 类。

CompletableFuture<Request> future1 = RequestConverter.Convert(requestDto);
CompletableFuture<String> future2 = tokenProvider.getAuthToken();

CompletableFuture<String> future3 = future1
    .thenCombine(future2, Pair::new)
    .thenCompose(pair -> requestProcessor.Process(pair.left, pair.right));

然后你可以先组合成一对然后组成。

{{1}}

答案 1 :(得分:2)

由于没有结合 thenCombine()thenCompose()的方法,您可以使用thenCompose()解包来自CompletableFuture的嵌套thenCombine() {1}}:

CompletableFuture<CompletableFuture<String>> future3 = 
    future1.thenCombine(future2, (request,token) -> 
        requestProcessor.Process(request,token));

CompletableFuture<String> future4 = future3.thenCompose(c -> c);