Repaso
English
Java CoreAvanzadoJV-32

¿Cuál es la diferencia práctica entre thenApply y thenCompose en CompletableFuture?

Opciones

  1. No hay ninguna diferencia, ambos son el mismo método
  2. thenApply transforma un resultado; thenCompose aplana futures (Opción correcta)
  3. thenCompose bloquea el thread; thenApply no
  4. thenApply gestiona los errores; thenCompose no

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.

Términos clave

Practica esta pregunta en Repaso