CompletableFuture supplyAsync с Stream.map () - PullRequest
0 голосов
/ 22 ноября 2018

ребята!У меня вопрос: что делает этот код:

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());

1 Ответ

0 голосов
/ 23 ноября 2018

этот код эквивалентен:

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

Чтобы сделать эту программу действительно параллельной, ее нужно изменить.Сначала запустите все запросы к базе данных параллельно:

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

и только после этого соберите все результаты:

List results = futures.stream
      .map(CompletableFuture::join)
      .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...