thenApply
et thenCompose
sont des méthodes de CompletableFuture
. Utilisez-les lorsque vous avez l'intention de faire quelque chose pour CompleteableFuture
le résultat avec a Function
.
thenApply
et les thenCompose
deux renvoient a CompletableFuture
comme leur propre résultat. Vous pouvez enchaîner plusieurs thenApply
ou thenCompose
ensemble. Fournissez un Function
à chaque appel, dont le résultat sera l'entrée du suivant Function
.
Le que Function
vous avez fourni doit parfois faire quelque chose de manière synchrone. Le type de retour de votre Function
doit être un non- Future
type. Dans ce cas, vous devez utiliser 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
D'autres fois, vous souhaiterez peut-être effectuer un traitement asynchrone Function
. Dans ce cas, vous devez utiliser thenCompose
. Le type de retour de votre Function
devrait être un CompletionStage
. Le suivant Function
dans la chaîne obtiendra le résultat de cela CompletionStage
comme entrée, déballant ainsi le fichier 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
C'est une idée similaire à celle de Javascript Promise
. Promise.then
peut accepter une fonction qui renvoie une valeur ou Promise
une valeur. La raison pour laquelle ces deux méthodes ont des noms différents en Java est due à l' effacement générique . Function<? super T,? extends U> fn
et Function<? super T,? extends CompletionStage<U>> fn
sont considérés comme du même type d'exécution - Function
. Ainsi thenApply
et thenCompose
doivent être nommés distinctement, sinon le compilateur Java se plaindrait de signatures de méthode identiques. Le résultat final étant, Javascript Promise.then
est implémenté en deux parties - thenApply
et thenCompose
- en Java.
Vous pouvez lire mon autre réponse si vous êtes également confus au sujet d'une fonction connexe thenApplyAsync
.
map
etflatMap
dansStream
?thenApply
est lemap
etthenCompose
est leflatMap
deCompletableFuture
. Vous utilisezthenCompose
pour éviter d'avoirCompletableFuture<CompletableFuture<..>>
.