java CompletableFuture.thenCombine returns CompletableFuture 的 CompletableFuture
java CompletableFuture.thenCombine returns CompletableFuture of CompletableFuture
我的应用程序中有 3 种不同的方法。全部 returning CompletableFuture<SomeType>
。我想并行执行方法 1 和 2。完成方法 1 和 2 后,我想使用方法 1 和 2 return 值的参数触发方法 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>
而不阻塞。这可能吗?
假设您有 Pair
class.
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));
由于没有组合 thenCombine()
和thenCompose()
的方法,您可以使用thenCompose()
展开嵌套的CompletableFuture
来自您的 thenCombine()
:
CompletableFuture<CompletableFuture<String>> future3 =
future1.thenCombine(future2, (request,token) ->
requestProcessor.Process(request,token));
CompletableFuture<String> future4 = future3.thenCompose(c -> c);
我的应用程序中有 3 种不同的方法。全部 returning CompletableFuture<SomeType>
。我想并行执行方法 1 和 2。完成方法 1 和 2 后,我想使用方法 1 和 2 return 值的参数触发方法 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>
而不阻塞。这可能吗?
假设您有 Pair
class.
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));
由于没有组合 thenCombine()
和thenCompose()
的方法,您可以使用thenCompose()
展开嵌套的CompletableFuture
来自您的 thenCombine()
:
CompletableFuture<CompletableFuture<String>> future3 =
future1.thenCombine(future2, (request,token) ->
requestProcessor.Process(request,token));
CompletableFuture<String> future4 = future3.thenCompose(c -> c);