一. 实体类
⏹用于封装从数据库中查询出的数据的实体类
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
}
]