es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes crear un Collector personalizado para CompletableFuture utilizando el método Collector.of(). Aquí tienes un ejemplo de cómo puedes implementarlo:

    private static <t> Collector<><t>, ?, CompletableFuture<><t>>> completableFuturesCollector() {
        return Collector.of(
                ArrayList::new, // proveedor
                List::add, // acumulador
                (izquierda, derecha) -> { izquierda.addAll(derecha); return izquierda; }, // combinador
                lista -> CompletableFuture.allOf(lista.toArray(new CompletableFuture[lista.size()]))
                    .thenApply(__ -> lista.stream()
                        .map(CompletableFuture::join)
                        .collect(Collectors.toList())) // finalizador
        );
    }
    

    Explicación:

    • El proveedor crea un nuevo ArrayList para almacenar los resultados de cada CompletableFuture completado.
    • El acumulador añade cada CompletableFuture completado a la lista.
    • El combinador combina dos listas de CompletableFuture completados. Es útil cuando este Collector se utiliza en un flujo paralelo, donde cada CompletableFuture podría completarse en un hilo diferente.
    • El finalizador se llama cuando todos los CompletableFuture están completados. Los une en una lista de resultados utilizando el método join() y devuelve un nuevo CompletableFuture completado con la lista de resultados.

    Para utilizar este colector personalizado, puedes llamar al método collect() en tu flujo de CompletableFuture:

    Stream<><bundleentryresponsecomponent>> futures = ...
    CompletableFuture<><bundleentryresponsecomponent>> allOfFuture = futures
        ...
        .collect(completableFuturesCollector());
    

    ¡Espero que esto te ayude!

Comments are closed.