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
CompletionStageque, 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
CompletionStageque, cuando esta etapa se completa normalmente, se ejecuta con esta etapa como argumento para la función proporcionada.
Entiendo que el segundo argumento de thenComposeCompletionStage se extiende donde thenApplyno lo hace.
¿Alguien podría dar un ejemplo en qué caso debo usar thenApplyy cuándo thenCompose?

mapyflatMapenStream?thenApplyes elmapythenComposees elflatMapdeCompletableFuture. UsasthenComposepara evitar tenerCompletableFuture<CompletableFuture<..>>.mapyflatMapy entiendo tu punto. Gracias de nuevo :)Respuestas:
thenApplyse utiliza si tiene una función de mapeo síncrono.thenComposese 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íathenComposela forma de aplanar la estructura.thenApplyAsyncporque 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
thenApplyythenComposecon 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 ambosthenApplyythenCompose. La diferencia está en los tipos de devolución:thenCompose()funciona como el de Scala,flatMapque aplana los futuros anidados.thenApply()devolvió los futuros anidados como estaban, perothenCompose()aplanó el anidadoCompletableFuturespara 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
mapyflatMapen primer lugar.thenApply()simplemente llamaráFunction.apply(), ythenCompose()es un poco similar a componer funciones.thenApplyythenComposeson métodos deCompletableFuture. Úselos cuando tenga la intención de hacer algo conCompleteableFutureel resultado de to con aFunction.thenApplyythenComposeambos devuelven unCompletableFuturecomo resultado. Puede encadenar variosthenApplyothenComposejuntos. Suministre aFunctiona cada llamada, cuyo resultado será la entrada a la siguienteFunction.El
Functionque proporcionó a veces necesita hacer algo sincrónicamente. El tipo de retorno de suFunctiondebe ser un noFuturetipo. 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 suFunctiondebería ser unCompletionStage. El siguienteFunctionen la cadena obtendrá el resultado de esoCompletionStagecomo entrada, desenvolviendo así elCompletionStage.Esta es una idea similar a la de Javascript
Promise.Promise.thenpuede aceptar una función que devuelve un valor oPromiseun 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> fnyFunction<? super T,? extends CompletionStage<U>> fnse consideran del mismo tipo de tiempo de ejecución -Function. Por lo tanto,thenApplyythenComposedebe 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.thense implementa en dos partes,thenApplyythenComposeen Java.Puede leer mi otra respuesta si también está confundido acerca de una función relacionada
thenApplyAsync.fuente