Je n'arrive pas à comprendre la différence entre thenApply(
) et thenCompose()
.
Alors, quelqu'un pourrait-il fournir un cas d'utilisation valide?
À partir de la documentation Java:
thenApply(Function<? super T,? extends U> fn)
Renvoie un nouveau
CompletionStage
qui, lorsque cette étape se termine normalement, est exécuté avec le résultat de cette étape comme argument de la fonction fournie.
thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
Renvoie un nouveau
CompletionStage
qui, lorsque cette étape se termine normalement, est exécuté avec cette étape comme argument de la fonction fournie.
J'obtiens que le 2ème argument d' thenCompose
étend le CompletionStage là où thenApply
ne le fait pas.
Quelqu'un pourrait-il donner un exemple dans quel cas je dois utiliser thenApply
et quand thenCompose
?
map
etflatMap
dansStream
?thenApply
est lemap
etthenCompose
est leflatMap
deCompletableFuture
. Vous utilisezthenCompose
pour éviter d'avoirCompletableFuture<CompletableFuture<..>>
.map
etflatMap
et je comprends votre point. Merci encore :)Réponses:
thenApply
est utilisé si vous avez une fonction de mappage synchrone.thenCompose
est utilisé si vous avez une fonction de mappage asynchrone (c'est-à-dire une fonction qui renvoie aCompletableFuture
). Il renverra alors un futur avec le résultat directement, plutôt qu'un futur imbriqué.la source
.thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1))
au lieu de.thenApplyAsync(x -> x+1)
? Être synchrone ou asynchrone n'est pas la différence pertinente.CompletableFuture
, alors ce serait là oùthenCompose
serait le moyen d'aplatir la structure.thenApplyAsync
parce que ce n'est pas ce que vous pensez que c'est.Je pense que la réponse publiée par @Joe C est trompeuse.
Laissez-moi essayer d'expliquer la différence entre
thenApply
etthenCompose
avec un exemple.Supposons que nous ayons 2 méthodes:
getUserInfo(int userId)
etgetUserRating(UserInfo userInfo)
:Les deux types de retour de méthode sont
CompletableFuture
.Nous voulons appeler en
getUserInfo()
premier, et une fois terminé, appelergetUserRating()
avec le résultatUserInfo
.À la fin de la
getUserInfo()
méthode, essayons les deuxthenApply
etthenCompose
. La différence réside dans les types de retour:thenCompose()
fonctionne comme ScalaflatMap
qui aplatit les futurs imbriqués.thenApply()
a renvoyé les futurs imbriqués tels qu'ils étaient, mais athenCompose()
aplati les futurs imbriquésCompletableFutures
afin qu'il soit plus facile de chaîner plus d'appels de méthode.la source
UserInfo
(alors oui) ou si elle doit être obtenue séparément, peut-être même coûteuse (puis non).Les Javadocs mis à jour dans Java 9 aideront probablement à mieux le comprendre:
puis appliquer
<U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)
puisComposer
la source
map
etflatMap
en premier lieu.thenApply()
vais simplement appelerFunction.apply()
, etthenCompose()
c'est un peu similaire à la composition de fonctions.thenApply
etthenCompose
sont des méthodes deCompletableFuture
. Utilisez-les lorsque vous avez l'intention de faire quelque chose pourCompleteableFuture
le résultat avec aFunction
.thenApply
et lesthenCompose
deux renvoient aCompletableFuture
comme leur propre résultat. Vous pouvez enchaîner plusieursthenApply
outhenCompose
ensemble. Fournissez unFunction
à chaque appel, dont le résultat sera l'entrée du suivantFunction
.Le que
Function
vous avez fourni doit parfois faire quelque chose de manière synchrone. Le type de retour de votreFunction
doit être un non-Future
type. Dans ce cas, vous devez utiliserthenApply
.D'autres fois, vous souhaiterez peut-être effectuer un traitement asynchrone
Function
. Dans ce cas, vous devez utiliserthenCompose
. Le type de retour de votreFunction
devrait être unCompletionStage
. Le suivantFunction
dans la chaîne obtiendra le résultat de celaCompletionStage
comme entrée, déballant ainsi le fichierCompletionStage
.C'est une idée similaire à celle de Javascript
Promise
.Promise.then
peut accepter une fonction qui renvoie une valeur ouPromise
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
etFunction<? super T,? extends CompletionStage<U>> fn
sont considérés comme du même type d'exécution -Function
. AinsithenApply
etthenCompose
doivent être nommés distinctement, sinon le compilateur Java se plaindrait de signatures de méthode identiques. Le résultat final étant, JavascriptPromise.then
est implémenté en deux parties -thenApply
etthenCompose
- en Java.Vous pouvez lire mon autre réponse si vous êtes également confus au sujet d'une fonction connexe
thenApplyAsync
.la source