2016-05-17 17 views
6

メソッドの呼び出し/結果を次の呼び出しに連鎖しようとしています。以前の呼び出しからobjBの参照を取得できない場合は、コンパイル時エラーメソッドが返されます。CompletableFuture連鎖結果

前の呼び出しの結果を次のチェーンに渡すにはどうすればよいですか?私はプロセスを完全に誤解したことがありますか?

Object objC = CompletableFuture.supplyAsync(() -> service.methodA(obj, width, height)) 
    .thenApply(objA -> { 
    try { 
     return service.methodB(objA); 
    } catch (Exception e) { 
     throw new CompletionException(e); 
    } 
}) 
    .thenApply(objA -> service.methodC(objA)) 
    .thenApply(objA -> { 
    try { 
     return service.methodD(objA); // this returns new objB how do I get it and pass to next chaining call 
     } catch (Exception e) { 
      throw new CompletionException(e); 
     } 
    }) 
    .thenApply((objA, objB) -> { 
     return service.methodE(objA, objB); // compilation error 
    }) 
.get(); 
+1

あなたは 'OBJAとmethodBの結果の両方を保持するタプルを返すthenApply'あなたの最初のを持っているかもしれません。あるいは、 'thenApplyAsync'ではなく' thenApplyAsync'ではなく、 'thenApply'呼び出しを1つのラムダにまとめることは機能的に同等で、' CompletableFuture'(または 'CompletionStage')を使用しているので、 –

+0

BTWの柔軟性を与えます。 )、私は最後のステップを実行する、例えば 'whenComplete(...)'や 'handle(...) 'のような補完で' get() 'を置きます。 UIエグゼキュータ、またはWebサービスでDTOを生成して返す(エラーが発生した場合、または成功した場合)ブロッキングを避けることは、通常、Javaの先物が提供しなければならない他のものと比較して、最良の「投資」です(他のすべてが役に立ちます)。 – acelent

答えて

6

あなたは変数に中間CompletableFutureを格納し、thenCombineを使用することができます。

CompletableFuture<ClassA> futureA = CompletableFuture.supplyAsync(...) 
    .thenApply(...) 
    .thenApply(...); 

CompletableFuture<ClassB> futureB = futureA.thenApply(...); 

CompletableFuture<ClassC> futureC = futureA.thenCombine(futureB, service::methodE); 

objC = futureC.join();