递归构建树菜单节点

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

复制代码
/**
 * 获取所有分类上下级信息
 */
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);
        }
    }
}
相关推荐
苹果醋341 分钟前
SpringCloud Alibaba场景实践(Nacos篇)
java·运维·spring boot·mysql·nginx
云边小网安2 小时前
java集合(十) ---- LinkedList 类
java·开发语言·青少年编程·java集合
乐神嘎嘎嘎2 小时前
springboot速通
java·spring boot
Zephyrtoria3 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法
你怎么知道我是队长4 小时前
GO语言---匿名函数
开发语言·后端·golang
yuren_xia7 小时前
RabbitMQ 知识详解(Java版)
java·rabbitmq·java-rabbitmq
kfyty7258 小时前
轻量级 ioc 框架 loveqq,支持接口上传 jar 格式的 starter 启动器并支持热加载其中的 bean
java·jvm·ioc·jar·热加载
G探险者8 小时前
为什么 Zookeeper 越扩越慢,而 Nacos 却越扩越快?
分布式·后端
早起鸟儿8 小时前
docker-Dockerfile 配置
java·linux·运维·docker
云边小网安8 小时前
java集合篇(六) ---- ListIterator 接口
java·开发语言·青少年编程·java集合