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