¿Cuál es la diferencia práctica entre thenApply y thenCompose en CompletableFuture?
Opciones
- No hay ninguna diferencia, ambos son el mismo método
thenApplytransforma un resultado;thenComposeaplana futures (Opción correcta)thenComposebloquea el thread;thenApplynothenApplygestiona los errores;thenComposeno
Respuesta
thenApply transforma el resultado con una función normal; thenCompose es para una función que ya devuelve un CompletableFuture, y lo aplana (como flatMap)
Por qué
Un CompletableFuture<T> representa un resultado que existirá más tarde, sin bloquear mientras esperas.
thenApply(f): cuando llega el resultado, aplica una función normal T -> U y obtienes un CompletableFuture<U>.
thenCompose(f): úsalo cuando f ya devuelve un CompletableFuture<U> (por ejemplo, otra llamada async). Sin él obtendrías un CompletableFuture<CompletableFuture<U>> anidado.
Es la misma idea que map frente a flatMap.
CompletableFuture<Order> order =
findUserAsync(id) // CF<User>
.thenCompose(u -> findOrderAsync(u)) // CF<Order>
.thenApply(o -> o.withTax());Recuerda
thenApply = map. thenCompose = flatMap.