Java8 Stream流处理树形结构数据 方式二

发布于:2024-04-14 ⋅ 阅读:(150) ⋅ 点赞:(0)


一. 实体类

⏹用于封装从数据库中查询出的数据的实体类

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class Department {

    /**
     * 主键Id
     */
    private String id;

    /**
     * 该部门的父部门Id
     */
    private Integer parentDeptId;

    /**
     * 真正部门Id
     */
    private Integer deptId;

    /**
     * 部门的名称
     */
    private String name;

    /**
     * 部门在结构中所处的层级
     */
    private Integer level;

    /**
     * 状态是否启用
     */
    private Integer status;
}

⏹用于封装返回给前端的数据,所构造的实体类

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class DepartmentVO implements Serializable {

    /**
     * 主键Id
     */
    protected String id;

    /**
     * 父部门Id
     */
    protected Integer parentDeptId;

    /**
     * 部门Id
     */
    protected Integer deptId;

    /**
     * 部门名称
     */
    protected String name;

    /**
     * 子节点集合,封装自己
     */
    private List<DepartmentVO> childrenList;
}

二. 模式数据库查询

private List<Department> findDataFromDB() {

    // 顶级部门的parentDeptId为0
    Department department1 = new Department().setParentDeptId(0).setId("A10").setDeptId(10).setLevel(1).setName("A部门").setStatus(0);
    Department department2 = new Department().setParentDeptId(0).setId("B20").setDeptId(20).setLevel(1).setName("B部门").setStatus(0);
    Department department3 = new Department().setParentDeptId(0).setId("C30").setDeptId(30).setLevel(1).setName("C部门").setStatus(1);

    Department department1_1 = new Department().setParentDeptId(10).setId("A10_1").setDeptId(101).setLevel(2).setName("A_1部门").setStatus(0);
    Department department1_2 = new Department().setParentDeptId(10).setId("A10_2").setDeptId(102).setLevel(2).setName("A_2部门").setStatus(0);
    Department department1_3 = new Department().setParentDeptId(10).setId("A10_3").setDeptId(103).setLevel(2).setName("A_3部门").setStatus(1);

    Department department1_1_1 = new Department().setParentDeptId(101).setId("A10_1_1").setDeptId(10101).setLevel(3).setName("A_1_1部门").setStatus(0);
    Department department1_1_2 = new Department().setParentDeptId(101).setId("A10_1_2").setDeptId(10102).setLevel(3).setName("A_1_1部门").setStatus(1);

    Department department1_2_1 = new Department().setParentDeptId(102).setId("A10_2_1").setDeptId(10201).setLevel(3).setName("A_2_1部门").setStatus(0);
    Department department1_2_2 = new Department().setParentDeptId(102).setId("A10_3_1").setDeptId(10202).setLevel(3).setName("A_2_1部门").setStatus(0);

    Department department2_1 = new Department().setParentDeptId(20).setId("B20_1").setDeptId(201).setLevel(2).setName("B_1部门").setStatus(0);

    Department department2_1_1 = new Department().setParentDeptId(201).setId("B20_1_1").setDeptId(20101).setLevel(3).setName("B_1_1部门").setStatus(0);
    Department department2_1_2 = new Department().setParentDeptId(201).setId("B20_1_2").setDeptId(20102).setLevel(3).setName("B_1_1部门").setStatus(1);

    return Arrays.asList(department1, department2, department3, department1_1, department1_2
            , department1_3, department1_1_1, department1_1_2, department1_2_1, department1_2_2
            , department2_1, department2_1_1, department2_1_2);
}

三. 使用stream流处理为树形结构

import org.springframework.beans.BeanUtils;
import org.springframework.boot.CommandLineRunner;
import java.util.stream.Collectors;
import java.util.*;

public class JmwApplication implements CommandLineRunner {
	
	// 用于封装参数的内部类
    private static class Const {
        private static final Integer TOP_DEPARTMENT_NUM = 0;
        private static final Integer SECOND_DEPARTMENT_NUM = 10;
    }

	@Override
	public void run(String... args) {

        // 模拟从数据库中查询数据
        List<Department> departmentList = this.findDataFromDB();

        // 将 List<Department> 转换为 List<DepartmentVO>
        List<DepartmentVO> departmentVOList = departmentList.stream().map((Department e) -> {
            DepartmentVO departmentVO = new DepartmentVO();
            BeanUtils.copyProperties(e, departmentVO);
            return departmentVO;
        }).collect(Collectors.toList());

        // 根据父节点的 parentDeptId 进行分组,得到父节点和List<DepartmentVO>的映射Map
        Map<Integer, List<DepartmentVO>> departmentMap = departmentVOList.stream()
                .collect(Collectors.groupingBy(DepartmentVO::getParentDeptId));

        // 遍历List<DepartmentVO>,得到完整的部门父子关系List集合
        departmentVOList.forEach(e -> e.setChildrenList(departmentMap.get(e.getDeptId())));

        /**
         * 根据顶级部门的 parentDeptId 获取出List<DepartmentVO>,可以得到树形结构数据
         * 想要获取哪一级别的部门数据,只需要修改 .filter的条件即可
         */
        List<DepartmentVO> resultDepartmentVOList = departmentVOList.stream()
                .filter((DepartmentVO e) -> Const.TOP_DEPARTMENT_NUM.equals(e.getParentDeptId()))
                .collect(Collectors.toList());

        System.out.println(resultDepartmentVOList);
    }
}

四. 处理完的树形结构数据

[
    {
        "id": "A10",
        "parentDeptId": 0,
        "deptId": 10,
        "name": "A部门",
        "childrenList": [
            {
                "id": "A10_1",
                "parentDeptId": 10,
                "deptId": 101,
                "name": "A_1部门",
                "childrenList": [
                    {
                        "id": "A10_1_1",
                        "parentDeptId": 101,
                        "deptId": 10101,
                        "name": "A_1_1部门",
                        "childrenList": null
                    },
                    {
                        "id": "A10_1_2",
                        "parentDeptId": 101,
                        "deptId": 10102,
                        "name": "A_1_1部门",
                        "childrenList": null
                    }
                ]
            },
            {
                "id": "A10_2",
                "parentDeptId": 10,
                "deptId": 102,
                "name": "A_2部门",
                "childrenList": [
                    {
                        "id": "A10_2_1",
                        "parentDeptId": 102,
                        "deptId": 10201,
                        "name": "A_2_1部门",
                        "childrenList": null
                    },
                    {
                        "id": "A10_3_1",
                        "parentDeptId": 102,
                        "deptId": 10202,
                        "name": "A_2_1部门",
                        "childrenList": null
                    }
                ]
            },
            {
                "id": "A10_3",
                "parentDeptId": 10,
                "deptId": 103,
                "name": "A_3部门",
                "childrenList": null
            }
        ]
    },
    {
        "id": "B20",
        "parentDeptId": 0,
        "deptId": 20,
        "name": "B部门",
        "childrenList": [
            {
                "id": "B20_1",
                "parentDeptId": 20,
                "deptId": 201,
                "name": "B_1部门",
                "childrenList": [
                    {
                        "id": "B20_1_1",
                        "parentDeptId": 201,
                        "deptId": 20101,
                        "name": "B_1_1部门",
                        "childrenList": null
                    },
                    {
                        "id": "B20_1_2",
                        "parentDeptId": 201,
                        "deptId": 20102,
                        "name": "B_1_1部门",
                        "childrenList": null
                    }
                ]
            }
        ]
    },
    {
        "id": "C30",
        "parentDeptId": 0,
        "deptId": 30,
        "name": "C部门",
        "childrenList": null
    }
]

网站公告

今日签到

点亮在社区的每一天
去签到