簡體   English   中英

Java:用流替換 forEach 循環

[英]Java: replace forEach loop with stream

在下面的方法中,我想用流替換 forEach 循環。

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>" 有沒有機會用流替換這個 forEach 循環?

您嘗試將Stream<Set<String>>收集到List<String> 這顯然是類型不匹配。 在使用.flatmap(Set::stream)收集Stream<String>之前,您需要將流展平為Stream<String>

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

在 Map 之后使用 .flatmap ,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM