递归构建树菜单节点

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

复制代码
/**
 * 获取所有分类上下级信息
 */
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);
        }
    }
}
相关推荐
AskHarries2 分钟前
PayPal 接入避坑
后端
谭光志4 分钟前
深入浅出 RAG:用一个可运行的 Demo 讲透完整链路
前端·后端·ai编程
wuqingshun3141594 分钟前
SpringBoot是如何实现自动配置的
java·spring boot·后端
用户053704031437 分钟前
我的学习记录泛型
java
zhouhui0019 分钟前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
java·spring boot·redis·ai编程
JRedisX16 分钟前
Java从零手写企业级内存数据库
java
萧瑟余晖18 分钟前
JDK 20 新特性详解
java·开发语言
hdsoft_huge21 分钟前
SpringBoot系列17:日志体系Logback配置,日志分割、脱敏、异常堆栈收集规范(生产级落地)
java·spring boot·logback
ymluo23 分钟前
WebRTC M80:VP9 多层(SVC:联播)崩溃问题定位与修复建议
后端
吃饱了得干活23 分钟前
扫码登录如何实现?从原理到实战
java·spring boot·redis