Java后台返回树形结构的二种实现方式

 更新时间:2026年06月29日 09:34:11   作者:Jamie Chyi  
本文介绍了两种Java后台生成树形结构的方法,包括递归实现和使用Hutool工具的方式,并展示了各自的实现效果,为开发者提供实用参考

Java后台返回树形结构

方式一、使用递归方式实现

    private List<SysDept> getSysDepts(String deptId) {
        // 1、获取表中所有数据 (自行根据实际场景拿到所有表数据)
        List<SysDept> all = getAllDept();
        // 3、返回的结果集
        List<SysDept> tree = new ArrayList<>();
        // 4、获取到最外层的部门信息
        List<SysDept> parentSysDept = all.stream().filter(dept -> dept.getDeptId().equals(deptId)).collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(parentSysDept)){
            // 5、取出部门信息
            SysDept dept = parentSysDept.get(0);
            // 6、放入集合中
            tree.add(dept);
            // 7、添加子节点
            addChildDept(dept, all);
        }
        return tree;
    }
    private void addChildDept(SysDept sysDept, List<SysDept> all) {
        // 1、拿到所传部门的字部门列表
        List<SysDept> tempList = all.stream()
                .filter(dept -> sysDept.getDeptId().equals(dept.getParentId()))
                .collect(Collectors.toList());
        sysDept.setChildren(tempList);
        tempList.forEach(dept -> {
            2、添加子节点
            addChildDept(dept, all);
        });
    }

效果展示:

方式二、利用Hutool工具进行实现

    private List<Tree<String>> getSysDepts(String deptId) {
        // 获取所有数据
        List<SysDept> all = getAllDept();
        //配置
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 自定义属性名 都要默认值的
        treeNodeConfig.setIdKey("deptId");
        // 最大递归深度
        treeNodeConfig.setDeep(4);

        //转换器 (这里参数的deptId,指的是最外层的deptId值)
        List<Tree<String>> treeNodes = TreeUtil.build(all, deptId, treeNodeConfig,
                (treeNode, tree) -> {
                    tree.setParentId(treeNode.getParentId());
                    // 扩展属性 ...(可以自行设置需要返回的字段)
                    tree.putExtra("deptId", treeNode.getDeptId());
                    tree.putExtra("status", treeNode.getStatus());
                });
        return treeNodes;
    }

效果展示:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • OpenFeign无法远程调用问题及解决

    OpenFeign无法远程调用问题及解决

    文章介绍了在使用Feign客户端时遇到的读超时问题,并分析了原因是系统启动时未先加载Nacos配置,为了解决这个问题,建议将Nacos配置放在`bootstrap.yml`文件中,以便项目启动时优先加载Nacos配置
    2024-11-11
  • MyBatis Plus大数据量查询慢原因分析及解决

    MyBatis Plus大数据量查询慢原因分析及解决

    大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次处理及配置调优
    2025-09-09
  • mybatis-sqlserver批量新增返回id方式

    mybatis-sqlserver批量新增返回id方式

    这篇文章主要介绍了mybatis-sqlserver批量新增返回id方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题

    永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题

    这篇文章主要介绍了永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Java面向对象之单例设计模式详解

    Java面向对象之单例设计模式详解

    这篇文章主要介绍了Java面向对象之单例设计模式详解,所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法,需要的朋友可以参考下
    2024-01-01
  • Java Iterator 的底层原理与 Iterable 的设计美学

    Java Iterator 的底层原理与 Iterable 的设计美学

    本文深入解析Java集合遍历背后的Iterator机制,探讨了增强for循环的真面目及为什么一边遍历一边删除会抛出异常,并提供了解决方案及最佳实践,感兴趣的朋友一起看看吧
    2026-06-06
  • MyBatis多对多映射初识教程

    MyBatis多对多映射初识教程

    这篇文章重点给大家介绍mybatis多对多映射,多对多映射的例子也很常见,本文通过代码实例相结合的方式给大家介绍mybatis多对多映射,需要的朋友参考下吧
    2016-08-08
  • Java中replace与replaceAll的区别与测试

    Java中replace与replaceAll的区别与测试

    replace和replaceAll是JAVA中常用的替换字符的方法,下面这篇文章主要给大家介绍了关于Java中replace与replaceAll的区别与测试,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • JAVA区间值判断[10,20)的实现

    JAVA区间值判断[10,20)的实现

    本文主要介绍了JAVA区间值判断[10,20)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • SpringBoot实现websocket服务端及客户端的详细过程

    SpringBoot实现websocket服务端及客户端的详细过程

    文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧
    2024-12-12

最新评论