¿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
CompletableFuturecompletados, 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
allOfyanyOfpara ejecutar varias tareas en paralelo.
Ejemplos de uso:
-
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")); -
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"; }); -
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 -
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 -
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 -
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().