Sobes.tech
Middle

¿Qué es CompletableFuture?

sobes.tech AI

Respuesta de la IA

CompletableFuture en Java 8+ representa una extensión del modelo Future, añadiendo capacidades de programación asíncrona y composición de tareas.

Implementa las interfaces CompletionStage y Future. CompletionStage define el contrato para la ejecución asíncrona y la composición de pasos computacionales.

Características clave:

  • Operaciones no bloqueantes: Permite ejecutar tareas de forma asíncrona sin bloquear el hilo principal.
  • Composición: Proporciona una API rica para enlazar y combinar resultados de múltiples operaciones asíncronas.
  • Manejo de excepciones: Mecanismos integrados para gestionar errores en flujos asíncronos.
  • Creación: Se pueden crear CompletableFuture completados, no completados o con errores.
  • Dependencias: Permite crear cadenas de tareas dependientes, donde la ejecución de una depende de la finalización de otra.
  • Ejecución paralela: Métodos como allOf y anyOf para ejecutar varias tareas en paralelo.

Ejemplos de uso:

  1. Creación y finalización:

    // Crear un CompletableFuture completado
    CompletableFuture<String> completedFuture = CompletableFuture.completedFuture("Hello");
    
    // Crear un CompletableFuture no completado y completarlo más tarde
    CompletableFuture<String> future = new CompletableFuture<>();
    // ... realizar trabajo asíncrono ...
    future.complete("Done");
    // O en caso de error
    // future.completeExceptionally(new RuntimeException("Error"));
    
  2. Ejecutar tarea asíncrona:

    CompletableFuture<String> asyncFuture = CompletableFuture.supplyAsync(() -> {
        // Trabajo asíncrono (por ejemplo, leer un archivo, solicitud de red)
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
        return "Resultado Asíncrono";
    });
    
  3. Composición con thenApply:

    CompletableFuture<Integer> result = CompletableFuture.supplyAsync(() -> 10)
        .thenApply(x -> x * 2); // El resultado del paso anterior se pasa a la función
    
  4. Composición con thenCombine:

    CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
    CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
    
    CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (res1, res2) -> res1 + res2); // Combina los resultados de dos CompletableFuture
    
  5. Manejo de finalización con thenAccept:

    CompletableFuture.supplyAsync(() -> "Resultado final")
        .thenAccept(result -> System.out.println("Tarea finalizada con resultado: " + result)); // Ejecuta una acción tras finalizar sin devolver valor
    
  6. Manejo de excepciones con exceptionally:

    CompletableFuture<String> futureWithException = CompletableFuture.supplyAsync(() -> {
        throw new RuntimeException("Algo salió mal");
    }).exceptionally(ex -> {
        System.err.println("Error ocurrido: " + ex.getMessage());
        return "Valor por defecto"; // Devuelve un valor por defecto en caso de error
    });
    

CompletableFuture simplifica significativamente la escritura de código asíncrono y no bloqueante en Java, haciéndolo más legible y mantenible en comparación con los callbacks tradicionales o llamadas bloqueantes a Future.get().