Java 具有递归子项的过滤器列表对象
Java Filter list object with Recursive Children
给定这个对象。
public class Menu {
private String id;
private String matchCode;
private List<Menu> children;
//getters and setters
/**
* Flattened funcition to recursive children list
*/
public Stream<Menu> flatenned() {
return Stream.concat(
Stream.of(this),
children.stream().flatMap(Menu::flatenned));
}
}
我需要过滤列表并删除与给定匹配代码不匹配的所有项(父项)。我还需要通过相同的字段 (matchCode)
过滤所有子项(此时可以有 'N' 个子项)
由于children是一个递归列表结构,我发现flatenned方法可以帮助实现这一点。 (see reference)
到目前为止我有这个。
private List<Menu> filterByMatchRoleCode(List<Menu> menuList) {
return menuList.stream()
.filter(p -> "string".matches(p.getMatchCode()))
.map(c -> c.getChildren()
.stream()
.map(o -> o.flatenned()
.map(Menu::getMatchCode)
.filter(v -> "string".matches(v)).collect(Collectors.toList())));
}
此方法 filterByMatchRoleCode 在尝试 return 值时出错。
希望有人能指出我所缺少的,或者能给我一个不同的方法。
我认为可以更简单。
private List<Menu> filterByMatchRoleCode(List<Menu> menuList) {
return menuList.stream()
.peek( x -> x.setChildren( filterByMatchRoleCode(x.children)))
.filter(p -> "string".matches(p.getMatchCode()))
.collect(Collectors.toList());
}
给定这个对象。
public class Menu {
private String id;
private String matchCode;
private List<Menu> children;
//getters and setters
/**
* Flattened funcition to recursive children list
*/
public Stream<Menu> flatenned() {
return Stream.concat(
Stream.of(this),
children.stream().flatMap(Menu::flatenned));
}
}
我需要过滤列表并删除与给定匹配代码不匹配的所有项(父项)。我还需要通过相同的字段 (matchCode)
过滤所有子项(此时可以有 'N' 个子项)由于children是一个递归列表结构,我发现flatenned方法可以帮助实现这一点。 (see reference)
到目前为止我有这个。
private List<Menu> filterByMatchRoleCode(List<Menu> menuList) {
return menuList.stream()
.filter(p -> "string".matches(p.getMatchCode()))
.map(c -> c.getChildren()
.stream()
.map(o -> o.flatenned()
.map(Menu::getMatchCode)
.filter(v -> "string".matches(v)).collect(Collectors.toList())));
}
此方法 filterByMatchRoleCode 在尝试 return 值时出错。
希望有人能指出我所缺少的,或者能给我一个不同的方法。
我认为可以更简单。
private List<Menu> filterByMatchRoleCode(List<Menu> menuList) {
return menuList.stream()
.peek( x -> x.setChildren( filterByMatchRoleCode(x.children)))
.filter(p -> "string".matches(p.getMatchCode()))
.collect(Collectors.toList());
}