2016-03-30 6 views
4

は、だから私は、次の例を持って考える:javaマルチネストされたCompletionStageは、 "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); 
      }); 
     } 
    }); 

}); 

私の問題は、全体CompletionStage<CompletionStage<CompletionStage<CompletionStage<Boolean>>>>マルチネストされた将来のタイプです。 ScalaでflatMapのようなものを使用してそれを単にCompletionStage<Boolean>に減らすことは可能ですか、それともこれを行う別の方法がありますか?

答えて

5

はい、あなたはthenCompose(fn)操作を探しています:

は、このステージが正常に完了した場合、供給関数の引数として、この段階で実行され、新しいCompletionStageを返します。

このメソッドは、この完了ステージの結果を受け取り、別の完了ステージを返すパラメータとしての機能を使用します。このように

は、次のものができます。

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

に注意を払いながら、このコードが何のためにあるのかでプレイフレームワークのために 'thenComposeAsyncは()'代わりに使用すべきであることに留意すべきです適切な実行コンテキスト。 – Blacklight

関連する問題