2016-05-17 22 views
6

Sto tentando di associare le chiamate/risultati dei metodi alla prossima chiamata. Ricevo l'errore di compilazione methodE perché non riesco a ottenere il riferimento di objB dalla chiamata precedente.Completabile Risultati concatenamento provvisorio

Come posso passare il risultato della chiamata precedente alla catena successiva? Ho completamente frainteso il processo?

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

Si potrebbe avere il vostro primo 'thenApply' restituire una tupla per gestire sia l'objA e il risultato di MethodB. Oppure, dal momento che stai usando 'thenApply' e non' thenApplyAsync', combinare le chiamate successive di 'thenApply' in un lambda è funzionalmente equivalente e ti dà la flessibilità che desideri –

+0

BTW, dal momento che stai usando' CompletableFuture' (o 'CompletionStage')), Sostituivo 'get()' con un completamento (ad esempio tramite 'whenComplete (...)' o 'handle (...)') che eseguiva l'ultimo passo, ad esempio, pianificando un futuro per il Esecutore dell'interfaccia utente o generazione e restituzione di un DTO in un servizio Web (in caso di successo o di eccezione, segnalazione di un errore). Evitare il blocco è di solito il miglior "investimento" rispetto a qualsiasi altra cosa che i futures di Java hanno da offrire (anche se tutto il resto è utile). – acelent

risposta

6

Si potrebbe memorizzare intermedio CompletableFuture in una variabile e quindi utilizzare thenCombine:

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

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

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

objC = futureC.join();