thenApply
e thenCompose
sono metodi di CompletableFuture
. Usali quando intendi fare qualcosa per CompleteableFuture
il risultato di con a Function
.
thenApply
ed thenCompose
entrambi restituiscono un CompletableFuture
come risultato. Puoi concatenare più thenApply
o thenCompose
insieme. Fornire Function
a ogni chiamata, il cui risultato sarà l'ingresso alla successiva Function
.
Il che Function
hai fornito a volte deve fare qualcosa in modo sincrono. Il tipo di ritorno del tuo Function
dovrebbe essere un non- Future
tipo. In questo caso dovresti usare thenApply
.
CompletableFuture.completedFuture(1)
.thenApply((x)->x+1) // adding one to the result synchronously, returns int
.thenApply((y)->System.println(y)); // value of y is 1 + 1 = 2
Altre volte potresti voler eseguire l'elaborazione asincrona in questo Function
. In tal caso dovresti usare thenCompose
. Il tipo di ritorno del tuo Function
dovrebbe essere un file CompletionStage
. Il successivo Function
nella catena otterrà il risultato di quello CompletionStage
come input, scartando così il file CompletionStage
.
// addOneAsync may be implemented by using another thread, or calling a remote method
abstract CompletableFuture<Integer> addOneAsync(int input);
CompletableFuture.completedFuture(1)
.thenCompose((x)->addOneAsync(x)) // doing something asynchronous, returns CompletableFuture<Integer>
.thenApply((y)->System.println(y)); // y is an Integer, the result of CompletableFuture<Integer> above
Questa è un'idea simile a quella di Javascript Promise
. Promise.then
può accettare una funzione che restituisce un valore o Promise
un valore. Il motivo per cui questi due metodi hanno nomi diversi in Java è dovuto alla cancellazione generica . Function<? super T,? extends U> fn
e Function<? super T,? extends CompletionStage<U>> fn
sono considerati lo stesso tipo di Runtime - Function
. Quindi thenApply
e thenCompose
devono essere denominati distintamente, altrimenti il compilatore Java si lamenterebbe delle firme del metodo identiche. Il risultato finale è che Javascript Promise.then
è implementato in due parti - thenApply
e thenCompose
- in Java.
Puoi leggere la mia altra risposta se sei anche confuso su una funzione correlata thenApplyAsync
.
map
eflatMap
inStream
?thenApply
è ilmap
edthenCompose
è ilflatMap
diCompletableFuture
. UsithenCompose
per evitare di avereCompletableFuture<CompletableFuture<..>>
.