树形菜单过滤
有两个树形结构的菜单数据小功能有点意思,特地记录一下
(1)过滤掉父级中断的数据
菜单列表数据,本来是,如果勾选了一个子级菜单,那么其所有上层父级菜单也会勾选保存到后台,此数据用户前端页面查询进行渲染成树形菜单,当然也可以后端直接处理成树形菜单(后端处理成树形菜单,那么父级中断的菜单就会直接过滤掉,不需要再处理),但是这个接口是个非树形列表,那么就需要简单过滤下(一般前端组件其实也不会报错,对于这种数据)
(2) 完全匹配父子级每一层
用于一些父子级名称匹配批量导入的功能,需要在导入excel中完整输入父子级,比如数据是 首页-工作台-用户列表,那么用户在excel中输入 首页-工作台1-用户列表或者 首页-用户列表这种不完全匹配的数据就需要过滤掉或业务异常中断提醒,完全匹配是因为数据库存的是id唯一,名称是可以跨级重复的,对于用户来说,他们只知道名称。
实操:
pom依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
</dependency>
(1)过滤中断
List<MenuDto> menuList = new ArrayList<>();
List<MenuDto> finalDtoList = menuList ;
menuList.stream().filter(p -> p.getPid().equals(0) || finalDtoList.stream()
.allMatch(parent -> parent.getPid().equals(p.getId())))
.collect(Collectors.toList());
(2)完全匹配
/**
* 匹配分类,严格从顶级到末级排序
* @param nameList 分类名称
* @param treeList 树形列表
* @return 末级分类
*/
public static Tree<String> matchCatalog(List<String> nameList, List<Tree<String>> treeList) {
if (ObjectUtils.isEmpty(nameList) || ObjectUtils.isEmpty(treeList)) {
return new Tree<>();
}
String targetName = nameList.get(0);
for (Tree<String> node : treeList) {
if (node.getName().equals(targetName)) {
if (nameList.size() == 1) {
return node;
} else {
return matchCatalog(nameList.subList(1, nameList.size()), node.getChildren());
}
}
}
return new Tree<>();
}