Sobes.tech
Middle

Cuéntanos sobre el concepto de la clase CompletableFuture.

sobes.tech AI

Respuesta de la IA

CompletableFuture — es una clase en Java 8+ que implementa las interfaces Future y CompletionStage. Representa un cálculo asíncrono que puede completarse (o fallar) en algún momento en el futuro y sobre el cual se pueden realizar acciones posteriores de manera declarativa, sin bloquear el hilo principal.

Las principales capacidades:

  • Ejecución asíncrona: Permite ejecutar tareas en un hilo separado (o en un grupo de hilos).
  • Composición: Se pueden combinar varios CompletableFuture, creando cadenas de acciones dependientes.
  • Manejo de excepciones: Proporciona métodos para gestionar errores en cálculos asíncronos.
  • Operaciones no bloqueantes: El resultado o la excepción se manejan cuando el future se completa, sin esperar explícitamente (get()).

Métodos clave:

  • Creación:
    • supplyAsync(Supplier<T> supplier): Ejecuta un Supplier de forma asíncrona y devuelve un CompletableFuture con su resultado.
    • runAsync(Runnable runnable): Ejecuta un Runnable de forma asíncrona y devuelve un CompletableFuture<Void>.
    • completedFuture(T value): Crea un CompletableFuture ya completado con un valor dado.
  • Transformación:
    • thenApply(Function<T, U> fn): Aplica una función al resultado cuando el future se completa.
    • thenAccept(Consumer<T> action): Ejecuta una acción sobre el resultado cuando el future se completa.
    • thenRun(Runnable action): Ejecuta una acción cuando el future se completa, ignorando el resultado.
    • thenCompose(Function<T, CompletionStage<U>> fn): Permite construir cadenas donde el resultado de un future se usa para crear otro.
  • Combinación:
    • thenCombine(CompletionStage<U> other, BiFunction<T, U, V> fn): Combina los resultados de dos futures.
    • allOf(CompletableFuture<?>... cfs): Devuelve un CompletableFuture<Void> que se completa cuando todos los futures pasados se completan.
    • anyOf(CompletableFuture<?>... cfs): Devuelve un CompletableFuture<Object> que se completa cuando cualquiera de los futures pasados se completa.
  • Manejo de excepciones:
    • exceptionally(Function<Throwable, T> fn): Gestiona excepciones devolviendo un valor alternativo.
    • handle(BiFunction<T, Throwable, U> fn): Gestiona tanto el resultado como la excepción.

Ejemplo:

// Ejecutar una tarea asíncrona
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // Simulación de trabajo prolongado
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    return "Resultado de la operación asíncrona";
});

// Realizar una acción después de que la tarea termine (sin bloquear)
future.thenAccept(result -> {
    System.out.println("Resultado obtenido: " + result);
});

// Otra acción que depende de la primera
future.thenApply(String::toUpperCase)
      .thenAccept(upperCaseResult -> {
          System.out.println("Resultado en mayúsculas: " + upperCaseResult);
      });

// Esperar a que terminen todas las tareas (en aplicaciones reales generalmente se evita usar get/join explícitamente)
// future.join();

CompletableFuture es una herramienta poderosa para escribir código reactivo y no bloqueante en Java, simplificando significativamente el trabajo con asincronía en comparación con la interfaz clásica Future.