Вложенные потоки Java 8 - преобразование в цепочку для циклов - PullRequest
0 голосов
/ 01 ноября 2018

В настоящее время я играюсь с функциями Java 8.

У меня есть следующий фрагмент кода, и я попробовал несколько способов использовать Stream s, но безуспешно.

for (CheckBox checkBox : checkBoxList) {
   for (String buttonFunction : buttonFunctionsList) {
      if (checkBox.getId().equals(buttonFunction)) {
          associatedCheckBoxList.add(checkBox);
      }
   }
}

Я попробовал следующее, но я не уверен, правильно это или нет:

checkBoxList.forEach(checkBox -> {
     buttonFunctionsList.forEach(buttonFunction -> {
     if (checkBox.getId().equals(buttonFunction))
     associatedCheckBoxList.add(checkBox);
     });
     });

Спасибо!

Ответы [ 2 ]

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

Ответ Эрана, вероятно, в порядке; но поскольку buttonFunctionList (предположительно) является списком, существует вероятность того, что он будет содержать повторяющиеся элементы, что означает, что исходный код будет добавлять флажки в связанный список несколько раз.

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

Таким образом, вы можете написать внутренний цикл как:

int n = Collections.frequency(buttonFunctionList, checkBox.getId();
associatedCheckboxList.addAll(Collections.nCopies(checkBox, n);

Таким образом, вы можете написать это как:

List<CheckBox> associatedCheckBoxList =
    checkBoxList.flatMap(cb -> nCopies(cb, frequency(buttonFunctionList, cb.getId())).stream())
        .collect(toList());

(Использование статического импорта для краткости)

Если либо checkBoxList, либо buttonFunctionList велико, вы можете рассмотреть возможность вычисления частот один раз:

Map<String, Long> frequencies = buttonFunctionList.stream().collect(groupingBy(k -> k, counting());

Тогда вы можете просто использовать это в лямбде в качестве параметра n для nCopies:

(int) frequencies.getOrDefault(cb.getId(), 0L)
0 голосов
/ 01 ноября 2018

Вы должны предпочесть collect над forEach, когда ваша цель - получить какой-то результат Collection:

List<CheckBox> associatedCheckBoxList =
    checkBoxList.stream()
                .filter(cb -> buttonFunctionsList.stream().anyMatch(bf -> cb.getId().equals(bf)))
                .collect(Collectors.toList());
...