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 unSupplierde forma asíncrona y devuelve unCompletableFuturecon su resultado.runAsync(Runnable runnable): Ejecuta unRunnablede forma asíncrona y devuelve unCompletableFuture<Void>.completedFuture(T value): Crea unCompletableFutureya 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 unCompletableFuture<Void>que se completa cuando todos los futures pasados se completan.anyOf(CompletableFuture<?>... cfs): Devuelve unCompletableFuture<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.