简体   繁体   中英

java CompletableFuture.thenCombine returns CompletableFuture of CompletableFuture

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM