Как обрабатывать 2 списка с помощью parallelStream - PullRequest
0 голосов
/ 26 октября 2018

У меня есть 2 группы номера счета на основе валюты CAD и USD. На основании этих списков мне нужно вызвать тот же метод, передав параметры запроса один для CAD, а другой для USD.

List<List<String>> accountNumberList = Arrays.asList(
      accountNumbersCAD, accountNumbersUSD
);
List<String> response = new ArrayList<>();
accountNumberList.parallelStream().forEach(s -> {
      String response1 = null;
      String response2 = null;
    try {
        response1 = performanceService.retrievePeriodData(reqCAD).toString();
        response2 = performanceService.retrievePeriodData(reqUSD).toString();   
    } catch (ApiException e) {

    }

      response.add(response1);
      response.add(response2);
    });

return (ResponseEntity<String>) response;

Пожалуйста, объясните мне, как использовать parallelStream.

Заранее спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

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

List<Double> response = Collections.synchronizedList(new ArrayList<>());

По моему мнению, отображение внутри потока не выглядит сложным, и, возможно, нет смысла использовать параллельный поток, сравните производительность последовательного и параллельного потока самостоятельно.

В качестве второго варианта вы можете использовать коллекцию 2 раза, и она должна быть более эффективной, чем использование синхронизированного списка.

Function<PerformanceDataRequest, String> mapper = s -> {
    try {
        return performanceService.retrievePeriodData(s).toString();
    } catch (ApiException e) {}
 };

List<String> response = accountNumberList.parallelStream().map(mapper.apply(reqCAD)).collect(Collectors.toList());
response.addAll(accountNumberList.parallelStream().map(mapper.apply(reqUSD)).collect(Collectors.toList()));

Я не знаю, что такое reqCAD /reqUSD поэтому я поставил E вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...