Cómo unirse a un flujo de CompletableFuture
Estoy buscando una manera de implementar un Collector
de CompletableFuture
.
Quiero decir, mi código actual es el siguiente:
private CompletableFuture<><bundleentryresponsecomponent>> makeAllOfCompletableFuture(List<><bundleentryresponsecomponent>> completableFutures) {
CompletableFuture<void> allFutures = CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[completableFutures.size()]));
CompletableFuture<><bundleentryresponsecomponent>> allCompletableFuture = allFutures.thenApply(future -> {
return completableFutures.stream()
.map(completableFuture -> completableFuture.join())
.collect(Collectors.toList());
});
CompletableFuture<><bundleentryresponsecomponent>> completableFuture = allCompletableFuture.toCompletableFuture();
return completableFuture;
}
Como puedes ver, estoy uniendo todos los CompletableFuture
del parámetro completableFutures
.
Me gustaría manejarlos como un stream de CompletableFuture
y unirlos utilizando un Collector
personalizado.
Algo como esto:
Stream<><bundleentryresponsecomponent>> futures ...
CompletableFuture<><bundleentryresponsecomponent>> allOfFuture = futures
...
.collect(???);
¿Alguna idea?
davy.ai
Sí, puedes crear un
Collector
personalizado paraCompletableFuture
utilizando el métodoCollector.of()
. Aquí tienes un ejemplo de cómo puedes implementarlo:Explicación:
proveedor
crea un nuevoArrayList
para almacenar los resultados de cadaCompletableFuture
completado.acumulador
añade cadaCompletableFuture
completado a la lista.combinador
combina dos listas deCompletableFuture
completados. Es útil cuando esteCollector
se utiliza en un flujo paralelo, donde cadaCompletableFuture
podría completarse en un hilo diferente.finalizador
se llama cuando todos losCompletableFuture
están completados. Los une en una lista de resultados utilizando el métodojoin()
y devuelve un nuevoCompletableFuture
completado con la lista de resultados.Para utilizar este colector personalizado, puedes llamar al método
collect()
en tu flujo deCompletableFuture
:¡Espero que esto te ayude!