I have 3 different methods in my application. All are returning CompletableFuture<SomeType>
. I want to execute method 1 and 2 in parallel. On completion of method 1 and 2, I want to trigger method 3 with parameters from method 1 and 2 return values.
Code example :
CompletableFuture<Request> future1 = RequestConverter.Convert(requestDto);
CompletableFuture<String> future2 = tokenProvider.getAuthToken();
CompletableFuture<CompletableFuture<String>> future3 =
future1.thenCombine(future2,(request,token) ->
requestProcessor.Process(request,token));
But the problem with the above code is that I am getting a CompletableFuture
of CompletableFuture
. I want to avoid this and get a simple CompletableFuture<String>
without blocking. Is this possible?
Suppose you have the 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;
}
}
Then you can first combine to a pair then compose.
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));
As there is no method that combines thenCombine()
and thenCompose()
, you can use thenCompose()
to unwrap nested CompletableFuture
s coming from your thenCombine()
:
CompletableFuture<CompletableFuture<String>> future3 =
future1.thenCombine(future2, (request,token) ->
requestProcessor.Process(request,token));
CompletableFuture<String> future4 = future3.thenCompose(c -> c);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.