java树形菜单过滤掉父级中断的数据&完全匹配父子级

树形菜单过滤

有两个树形结构的菜单数据小功能有点意思,特地记录一下

(1)过滤掉父级中断的数据

菜单列表数据,本来是,如果勾选了一个子级菜单,那么其所有上层父级菜单也会勾选保存到后台,此数据用户前端页面查询进行渲染成树形菜单,当然也可以后端直接处理成树形菜单(后端处理成树形菜单,那么父级中断的菜单就会直接过滤掉,不需要再处理),但是这个接口是个非树形列表,那么就需要简单过滤下(一般前端组件其实也不会报错,对于这种数据)

(2) 完全匹配父子级每一层

用于一些父子级名称匹配批量导入的功能,需要在导入excel中完整输入父子级,比如数据是 首页-工作台-用户列表,那么用户在excel中输入 首页-工作台1-用户列表或者 首页-用户列表这种不完全匹配的数据就需要过滤掉或业务异常中断提醒,完全匹配是因为数据库存的是id唯一,名称是可以跨级重复的,对于用户来说,他们只知道名称。

实操:

pom依赖

    
        cn.hutool
        hutool-core
    

(1)过滤中断

List menuList = new ArrayList<>();
List 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 matchCatalog(List nameList, List> treeList) {
    if (ObjectUtils.isEmpty(nameList) || ObjectUtils.isEmpty(treeList)) {
        return new Tree<>();
    }
    String targetName = nameList.get(0);
    for (Tree 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<>();
}

你可能感兴趣的:(java工具类,java,开发语言)