Java: заменить forEach l oop на поток - PullRequest
1 голос
/ 22 января 2020

В следующем методе я хочу заменить forEach l oop потоком.

protected Set<String> getSelectedPaths(final CheckModel<TreeItem<String>> checkModel, final LazyTreeItem root) {

      final Set<String> ceckedList = new HashSet<>();
      final List<TreeItem<String>> children = root.getChildren();
      final List<LazyTreeItem> lazyChildren = children.stream().map((item -> (LazyTreeItem) item))
            .collect(Collectors.toList());

      final List<String> selectedChildren = new ArrayList<>();
      children.forEach(child -> selectedChildren.addAll(getSelectedPaths(checkModel, (LazyTreeItem) child)));

      /**
      * do sth with checkedList
      */
     return checkedList

строки

      final List<String> selectedChildren = new ArrayList<>();
      children.forEach(child -> selectedChildren.addAll(getSelectedPaths(checkModel, (LazyTreeItem) child)));

должны быть заменены потоком. Я пытался с

      final List<String> selectedChildren = children.stream().map(child->getSelectedPaths(checkModel, (LazyTreeItem) child)).collect(Collectors.toList());

, но ошибка компилятора " Type mismatch: cannot convert from List<Set<String>> to List<String>" выдается. Есть ли возможность заменить это для каждого l oop потоком?

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Вы пытаетесь собрать Stream<Set<String>> в List<String>. Это, очевидно, несоответствие типов. Вам нужно сгладить поток в Stream<String> перед его сбором, используя .flatmap(Set::stream).

1 голос
/ 22 января 2020

Использование .flatmap после Map,

final List<String> selectedChildren = children.stream().map(child->getSelectedPaths(checkModel, (LazyTreeItem) child)).flatMap(child.stream()).distinct().collect(Collectors.toList());
1 голос
/ 22 января 2020

Ваша операция map создает Stream<Set<String>> (поскольку каждый элемент исходного Stream<TreeItem<String>> сопоставляется с Set<String>), что приводит к List<Set<String>>.

. получите List<String>, что вам нужно использовать flatMap:

final List<String> selectedChildren = 
    children.stream()
            .flatMap(child->getSelectedPaths(checkModel, (LazyTreeItem) child).stream())
            .collect(Collectors.toList());
...