No puedo entender la diferencia entre thenApply(
) y thenCompose()
.
Entonces, ¿alguien podría proporcionar un caso de uso válido?
De los documentos de Java:
thenApply(Function<? super T,? extends U> fn)
Devuelve un nuevo
CompletionStage
que, cuando esta etapa se completa normalmente, se ejecuta con el resultado de esta etapa como argumento de la función proporcionada.
thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
Devuelve un nuevo
CompletionStage
que, cuando esta etapa se completa normalmente, se ejecuta con esta etapa como argumento para la función proporcionada.
Entiendo que el segundo argumento de thenCompose
CompletionStage se extiende donde thenApply
no lo hace.
¿Alguien podría dar un ejemplo en qué caso debo usar thenApply
y cuándo thenCompose
?
map
yflatMap
enStream
?thenApply
es elmap
ythenCompose
es elflatMap
deCompletableFuture
. UsasthenCompose
para evitar tenerCompletableFuture<CompletableFuture<..>>
.map
yflatMap
y entiendo tu punto. Gracias de nuevo :)Respuestas:
thenApply
se utiliza si tiene una función de mapeo síncrono.thenCompose
se utiliza si tiene una función de mapeo asincrónica (es decir, una que devuelve aCompletableFuture
). Luego devolverá un futuro con el resultado directamente, en lugar de un futuro anidado.fuente
.thenCompose(x -> CompletableFuture.supplyAsync(() -> x+1))
lugar de.thenApplyAsync(x -> x+1)
? Ser sincrónico o asincrónico no es la diferencia relevante.CompletableFuture
, entonces esta seríathenCompose
la forma de aplanar la estructura.thenApplyAsync
porque no es lo que cree que es.Creo que la respuesta publicada por @Joe C es engañosa.
Permítanme intentar explicar la diferencia entre
thenApply
ythenCompose
con un ejemplo.Supongamos que tenemos 2 métodos:
getUserInfo(int userId)
ygetUserRating(UserInfo userInfo)
:Ambos tipos de retorno de método son
CompletableFuture
.Queremos llamar
getUserInfo()
primero, y al finalizar, llamargetUserRating()
con el resultadoUserInfo
.Al finalizar el
getUserInfo()
método, probemos ambosthenApply
ythenCompose
. La diferencia está en los tipos de devolución:thenCompose()
funciona como el de Scala,flatMap
que aplana los futuros anidados.thenApply()
devolvió los futuros anidados como estaban, perothenCompose()
aplanó el anidadoCompletableFutures
para que sea más fácil encadenar más llamadas a métodos.fuente
UserInfo
(entonces sí) o si debe obtenerse por separado, tal vez incluso costoso (entonces no).Los Javadocs actualizados en Java 9 probablemente ayudarán a comprenderlo mejor:
luego aplicar
<U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)
luego componer
fuente
map
yflatMap
en primer lugar.thenApply()
simplemente llamaráFunction.apply()
, ythenCompose()
es un poco similar a componer funciones.thenApply
ythenCompose
son métodos deCompletableFuture
. Úselos cuando tenga la intención de hacer algo conCompleteableFuture
el resultado de to con aFunction
.thenApply
ythenCompose
ambos devuelven unCompletableFuture
como resultado. Puede encadenar variosthenApply
othenCompose
juntos. Suministre aFunction
a cada llamada, cuyo resultado será la entrada a la siguienteFunction
.El
Function
que proporcionó a veces necesita hacer algo sincrónicamente. El tipo de retorno de suFunction
debe ser un noFuture
tipo. En este caso debes usarthenApply
.En otras ocasiones, es posible que desee realizar un procesamiento asincrónico en este
Function
. En ese caso deberías usarthenCompose
. El tipo de retorno de suFunction
debería ser unCompletionStage
. El siguienteFunction
en la cadena obtendrá el resultado de esoCompletionStage
como entrada, desenvolviendo así elCompletionStage
.Esta es una idea similar a la de Javascript
Promise
.Promise.then
puede aceptar una función que devuelve un valor oPromise
un valor. La razón por la que estos dos métodos tienen nombres diferentes en Java se debe al borrado genérico .Function<? super T,? extends U> fn
yFunction<? super T,? extends CompletionStage<U>> fn
se consideran del mismo tipo de tiempo de ejecución -Function
. Por lo tanto,thenApply
ythenCompose
debe tener un nombre distinto, o el compilador de Java se quejaría de firmas de métodos idénticas. El resultado final es que JavascriptPromise.then
se implementa en dos partes,thenApply
ythenCompose
en Java.Puede leer mi otra respuesta si también está confundido acerca de una función relacionada
thenApplyAsync
.fuente