12

メソッドの呼び出し/結果を次の呼び出しにチェーンしようとしています。前の呼び出しから objB の参照を取得できない場合、コンパイル時エラー methodE が発生します。

前の呼び出しの結果を次のチェーンに渡すにはどうすればよいですか? プロセスを完全に誤解していませんか?

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();
4

2 に答える 2

11

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();
于 2016-05-17T06:54:02.343 に答える