Chłopaki! Mam pytanie: co robi ten kod:

Collection<Contract.class> contracts = fillTheCollectionFromDb();
contracts.stream().filter(condition)
                  .map(contractItem ->
                       CompletableFuture.supplyAsync(() -> 
                           {T result = getAnotherDataFromDb(contractItem); 
                            return result;}, Executor.class)
                  )//end .map
                  .map(CompletableFuture::join).collect(Collectors.toList());
3
Alex 22 listopad 2018, 19:33
Jaki to język programowania? Wygląda jak Java, ale ".class" jest używane niepoprawnie w obu przypadkach.
 – 
Alexei Kaigorodov
22 listopad 2018, 20:05
Java + wiosenny rozruch. Na przykład rozszerzenie .class.
 – 
Alex
22 listopad 2018, 23:33

1 odpowiedź

Najlepsza odpowiedź

Ten kod jest odpowiednikiem:

Collection<Contract> contracts = fillTheCollectionFromDb();
contracts.stream().filter(condition)
              .map(this::getAnotherDataFromDb)
              .collect(Collectors.toList());

Aby ten program był naprawdę równoległy, należy go zmodyfikować. Najpierw uruchom równolegle wszystkie żądania do bazy danych:

Collection<Contract> contracts = fillTheCollectionFromDb();
List<CompletableFuture> futures = contracts.stream().filter(condition)
              .map(contractItem ->
                   CompletableFuture.supplyAsync(
                         ()->getAnotherDataFromDb(contractItem),
                       executor)
              )//end .map
              .collect(Collectors.toList());

I dopiero potem zbierz wszystkie wyniki:

List results = futures.stream
      .map(CompletableFuture::join)
      .collect(Collectors.toList());
6
Alexei Kaigorodov 23 listopad 2018, 07:45