递归构建树菜单节点

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

复制代码
/**
 * 获取所有分类上下级信息
 */
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);
        }
    }
}
相关推荐
yolo_Yang5 分钟前
72.是否可以把所有Bean都通过Spring容器来管
后端·spring
村姑飞来了14 分钟前
Kafka4.1.0 队列模式尝鲜
后端·架构
oak隔壁找我21 分钟前
ShardingJdbc配置说明
java·后端
javachen__32 分钟前
Spring Boot将错误日志发送到企微微信或钉钉群
spring boot·后端·钉钉
升鲜宝供应链及收银系统源代码服务1 小时前
升鲜宝供应链管理系统-生鲜配送系统_分拣端界面重构设计(一)
spring boot·重构·开源·收银系统·生鲜门店·升鲜宝多门店收银系统
JaguarJack1 小时前
PHP 基金会宣布:Streams 现代化 将引入事件循环与异步新能力
后端·php
lzjava20241 小时前
Spring AI实现一个智能客服
java·人工智能·spring
Mos_x1 小时前
HeidiSQL导入与导出数据
java·后端
oak隔壁找我1 小时前
Elasticsearch QueryBuilders 高级使用案例
java·后端
青云交1 小时前
Java 大视界 -- Java 大数据在智能家居能源消耗模式分析与节能策略制定中的应用
java·大数据·智能家居·数据采集·能源消耗模式分析·节能策略制定·节能效果评估