Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

439
Vistas
¿Cómo combinar dos resultados de CompletableFuture cuando uno depende del otro?

Hay 2 servicios:

  1. Service1 devuelve la lista de ids1;
  2. Service2 devuelve la lista de ids2 por id1:

¿Cómo puedo agrupar el resultado por id1 -> [id2, id2, id2, ...] usando CompletableFuture ?
Estaba pensando en ponerlo todo en HashMap, pero no entiendo cómo pasar ids1 al segundo Future. Estaba pensando en usar thenCombine(ids1Future, (v1, v2) -> {...}) , pero me parece bastante feo. ¿Existen "mejores prácticas" para hacerlo?

Aquí no hay una forma asíncrona:

 Map<ID1, List<ID2>> idsMap = new HashMap(); List<IDS1> ids1List = service1.service.find(); for (ID1 id1: IDS1) { List<IDS2> ids2List = service2.findById(id1); idsMap.put(id1, ids2List); } service2.process(idsMap);

Tratando de hacerlo asíncrono:

 CompletableFuture<List<IDS1>> ids1Future = CompletableFuture.supplyAsync(() -> service.find()); ids1Future.thenApply((ids1) -> { CompletableFuture<List<IDS2>> listFutureIds2 = ids1.stream().map(id1 -> CompletableFuture.supplyAsync(() -> service2.getById(id1))) .collect(Collectors.toList()); CompletableFuture<Void> allFuturesDone = CompletableFuture.allOf( listFutureIds2.toArray( new CompletableFuture[listFutureIds2.size()])); allFuturesDone.thenApply(v -> list.stream() .map(CompletableFuture::join) .collect(toList())); });
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Este es un ejemplo de cómo usar Fork/Join para convertir una lista de caracteres en una lista de cadenas, donde cada cadena es una réplica de N veces del carácter. Puede ajustar este ejemplo a su caso.

Espero que esto sea lo que estás buscando.

 import java.util.Collection; import java.util.List; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; import java.util.stream.Collectors; public class ForkJoinExample { public static class RepeatTask extends RecursiveTask<List<String>> { private final List<Character> chars; private final int repeatCount; public RepeatTask(List<Character> chars, int repeatCount) { this.chars = chars; this.repeatCount = repeatCount; } public RepeatTask(Character c, int repeatCount) { this.chars = List.of(c); this.repeatCount = repeatCount; } @Override protected List<String> compute() { if (chars.size() > 1) { ForkJoinTask.invokeAll(chars.stream().map(c -> new RepeatTask(c, repeatCount)).collect(Collectors.toList())); return ForkJoinTask.invokeAll(chars.stream().map(c -> new RepeatTask(c, repeatCount)).collect(Collectors.toList())) .stream() .map(ForkJoinTask::join) .flatMap(Collection::stream) .collect(Collectors.toList()); } return List.of(String.valueOf(chars.get(0)).repeat(Math.max(0, repeatCount))); } } public static void main(String[] args) { ForkJoinPool commonPool = ForkJoinPool.commonPool(); RepeatTask task = new RepeatTask(List.of('a', 'b', 'c'), 4); commonPool.execute(task); System.out.println(task.join()); } }

El resultado es este: [aaaa, bbbb, cccc]

over 4 years ago · Santiago Trujillo Denunciar

0

Espero haberte entendido bien, así que aquí está:

 CompletableFuture<List<IDS1>> ids1Future = CompletableFuture.supplyAsync(service::find); CompletableFuture<Map<IDS1, List<IDS2>>> map = ids1Future.thenApply(listIDS1 -> { List<Entry<IDS1, CompletableFuture<List<IDS2>>>> list = listIDS1 .stream() .map(ids1 -> new SimpleEntry<>(ids1, CompletableFuture.supplyAsync(() -> service2.getById(ids1)))) .collect(Collectors.toList()); return list.stream() .map(entry -> new SimpleEntry<>(entry.getKey(), entry.getValue().join())) .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); }); Map<IDS1, List<IDS2>> result = map.join();
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda