递归构建树菜单节点

一、获取所有分类上下级信息

复制代码
/**
 * 获取所有分类上下级信息
 */
public R<List<ResearchTypeTreeVO>> getTypeTreeList(){
    //获取所有分类数据
    List<ResearchTypeVO> list = ibResearchTypeService.getSuperList(null);
    List<ResearchTypeTreeVO> researchTypeTreeVOList = null;
    if(CollectionUtil.isNotEmpty(list)){
        researchTypeTreeVOList = buildMenuTrees(list);
    }
    return R.data(researchTypeTreeVOList);
}

二、构建数据

复制代码
 public static List<ResearchTypeTreeVO> buildMenuTrees(List<ResearchTypeVO> list) {
    if(CollectionUtils.isEmpty(list)){
        return new ArrayList<>();
    }
    Map<Long, ResearchTypeVO> researchTypeVOMap = list.stream().collect((Collectors.toMap(ResearchTypeVO::getId, item -> item, (o, n) -> o)));

    //上级数据
    List<ResearchTypeTreeVO> parentList = new ArrayList<>();
    List<ResearchTypeTreeVO> childList = new ArrayList<>();
    for (ResearchTypeVO vo : list) {
        long parentId = vo.getSuperId();
        ResearchTypeTreeVO option = new ResearchTypeTreeVO();
        option.setId(vo.getId());
        option.setSuperId(parentId);
        option.setSuperName(vo.getSuperName());
        option.setLabel(vo.getTypeName());
        option.setValue(vo.getTypeCode());
        // 尝试查找父菜单项,如果不存在则dictBiz是顶级菜单项
        ResearchTypeVO researchTypeVO = researchTypeVOMap.get(parentId);
        if(Objects.isNull(researchTypeVO)){
            parentList.add(option);
        }else {
            childList.add(option);
        }
    }
    //对查询出来的菜单进行整理 整理为树状
    sortMenu(parentList, childList);
    return parentList;
}

三、递归

复制代码
private static void sortMenu(List<ResearchTypeTreeVO> parentList, List<ResearchTypeTreeVO> childMenus) {
    for (ResearchTypeTreeVO parent : parentList) {
        List<ResearchTypeTreeVO> children = childMenus.stream()
                .filter(child -> child.getSuperId().equals(parent.getId()) )
                .collect(Collectors.toList());
        // 设置父节点的子节点列表
        parent.setChildren(children);

        // 如果子节点列表不为空,则递归地对子节点进行排序
        if (!children.isEmpty()) {
            sortMenu(children, childMenus);
        }
    }
}
相关推荐
Lyyaoo.1 分钟前
Spring,Spring MVC, Spring Boot
spring boot·spring·mvc
元俭2 分钟前
【Eino 框架入门】用 Agent 实现多轮对话
后端
斯瓦辛武2 分钟前
linux系统安装skywalking
后端
学习指针路上的小学渣3 分钟前
requests笔记
后端·python
zhangren024684 分钟前
Laravel8.x核心特性全解析
vue.js·spring boot·mysql
Java源码jdk7 分钟前
基于javaweb和mysql的springboot校园二手书交易管理系统(java+springboot+vue+elementui+layui+mysql)
java·spring boot·mysql
CodeSheep13 分钟前
JetBrains又一知名软件宣布倒下,五味杂陈
前端·后端·程序员
毕设源码-邱学长15 分钟前
【开题答辩全过程】以 校园博客系统 为例,包含答辩的问题和答案
java
毕设源码-赖学姐15 分钟前
【开题答辩全过程】以 小学体育用品管理系统为例,包含答辩的问题和答案
java
SimonKing19 分钟前
GitHub热榜1k星影视壳(OuonnkiTV)遇上AI影视源
java·后端·程序员