thenApplyet thenComposesont des méthodes de CompletableFuture. Utilisez-les lorsque vous avez l'intention de faire quelque chose pour CompleteableFuturele résultat avec a Function.
thenApplyet les thenComposedeux renvoient a CompletableFuturecomme leur propre résultat. Vous pouvez enchaîner plusieurs thenApplyou thenComposeensemble. Fournissez un Functionà chaque appel, dont le résultat sera l'entrée du suivant Function.
Le que Functionvous avez fourni doit parfois faire quelque chose de manière synchrone. Le type de retour de votre Functiondoit être un non- Futuretype. 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 Functiondevrait être un CompletionStage. Le suivant Functiondans la chaîne obtiendra le résultat de cela CompletionStagecomme 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.thenpeut accepter une fonction qui renvoie une valeur ou Promiseune 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> fnet Function<? super T,? extends CompletionStage<U>> fnsont considérés comme du même type d'exécution - Function. Ainsi thenApplyet thenComposedoivent être nommés distinctement, sinon le compilateur Java se plaindrait de signatures de méthode identiques. Le résultat final étant, Javascript Promise.thenest implémenté en deux parties - thenApplyet thenCompose- en Java.
Vous pouvez lire mon autre réponse si vous êtes également confus au sujet d'une fonction connexe thenApplyAsync.
mapetflatMapdansStream?thenApplyest lemapetthenComposeest leflatMapdeCompletableFuture. Vous utilisezthenComposepour éviter d'avoirCompletableFuture<CompletableFuture<..>>.