[英]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.