递归构建树菜单节点

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

复制代码
/**
 * 获取所有分类上下级信息
 */
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);
        }
    }
}
相关推荐
步行cgn16 分钟前
Spring c 命名空间注入详解
java·后端·spring
明月_清风34 分钟前
Maven 到底是什么?一篇文章搞懂 Java 项目构建与依赖管理
java·后端·maven
明月_清风1 小时前
AI 越来越强,程序员真正的价值到底是什么?
人工智能·后端
aramae1 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
Rain的Java大神之路1 小时前
如何快速上传10G文件
java·spring boot·redis·后端·mysql·spring cloud·面试
Wang's Blog2 小时前
Java 接入Redis: 通用命令与键管理
java·服务器·redis
Wang's Blog2 小时前
Java 接入Redis: 列表集合与有序集合操作命令
java·服务器·redis
Ivanqhz3 小时前
SVD++算法
java·服务器·网络·深度学习·神经网络
码事漫谈3 小时前
别再跟AI说“请”了,它根本不 care——但有个东西它超在意
后端
qq_2518364573 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程