2016-03-30 6 views
4

So bedenkt, dass ich das folgende Beispiel haben:java multi verschachtelte CompletionStage entspricht "flatMap"?

CompletionStage<String> tokenFuture = getToken(); 

CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>> result = tokenFuture.thenApply(token -> { 

    WSRequest request = ws.url(url).setHeader("Authorization", "Bearer " + token); 

    CompletionStage<WSResponse> response = request.post(json); 

    return response.thenApply(r -> { 
     if (r.getStatus() == 201) { 
      return CompletableFuture.supplyAsync(() -> CompletableFuture.supplyAsync(() -> true)); 
     } else { 
      return getToken().thenApply(t -> { 
       WSRequest req = ws.url(url).setHeader("Authorization", "Bearer " + t); 
       return req.post(json).thenApply(b -> b.getStatus() == 201); 
      }); 
     } 
    }); 

}); 

Mein Problem mit der ganzen CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>> Multi verschachtelten Zukunft Typ ist. Ist es möglich, es auf nur CompletionStage<Boolean> zu reduzieren, indem man so etwas wie flatMap in Scala verwendet oder gibt es eine andere Möglichkeit, dies zu tun?

Antwort

5

Ja, Sie suchen den thenCompose(fn) Betrieb:

Gibt einen neuen CompletionStag, die, wenn diese Phase normalerweise abgeschlossen ist, mit dieser Phase als Argument für die bereitgestellte Funktion ausgeführt wird.

Diese Methode übernimmt eine Funktion als Parameter, die das Ergebnis dieser Abschlussstufe übernimmt und eine weitere Abschlussstufe zurückgibt.

Als solche könnten Sie haben die folgende:

CompletionStage<String> tokenFuture = getToken(); 

CompletionStage<Boolean> result = tokenFuture.thenCompose(token -> { 

    WSRequest request = ws.url(url).setHeader("Authorization", "Bearer " + token); 

    CompletionStage<WSResponse> response = request.post(json); 

    return response.thenCompose(r -> { 
     if (r.getStatus() == 201) { 
      return CompletableFuture.supplyAsync(() -> true); 
     } else { 
      return getToken().thenCompose(t -> { 
       WSRequest req = ws.url(url).setHeader("Authorization", "Bearer " + t); 
       return req.post(json).thenApply(b -> b.getStatus() == 201); 
      }); 
     } 
    }); 

}); 
+0

Es sollte beachtet werden, dass für die Play-Framework, das dieser Code ist das, was ist, 'thenComposeAsync()' sollte stattdessen während Aufmerksamkeit verwendet werden, um der richtige Ausführungskontext. – Blacklight