-->

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;
    }

效果展示:

 

 

posted @ 2023-09-06 09:41  角刀牛Java  阅读(675)  评论(0编辑  收藏  举报