業務場景
進行業務開發時,有時前端需要一個樹形導航菜單,或者分類菜單,這樣就需要后端把數據封裝成一個樹形結構。比較常見的像導航菜單、省市區級聯等。
在此模擬一個類似場景,查詢部門信息,並且存在上下級。
實體類
實體類中使用parentCode
來實現數據關聯。
/**
* @author Yoko
* @date 2021/10/28
*/
@Data
@Builder
public class Department {
/**
* 公司編碼
*/
private Integer companyCode;
/**
* 部門名稱
*/
private String name;
/**
* 部門編碼
*/
private Integer code;
/**
* 上級部門編碼
*/
private Integer parentCode;
/**
* 部門下所管轄部門
*/
private List<Department> children;
}
業務實現
public static void main(String[] args) {
// 查詢公司下所有部門信息
List<com.hqins.ishare.user.demo.Department> departmentList = departmentListByCompanyCode();
// 使用filter()過濾,獲取最上層部門
List<com.hqins.ishare.user.demo.Department> result = departmentList.stream().filter(depart -> 0 == depart.getParentCode())
// 使用peek() 為上級部門添加下級部門
.peek(depart -> depart.setChildren(createChildList(depart, departmentList)))
// 排序
.sorted(Comparator.comparing(com.hqins.ishare.user.demo.Department:: getCode))
// 收集數據至list
.collect(Collectors.toList());
System.out.println(JSONObject.toJSONString(result));
}
/**
* 遞歸獲取
* 根據當前部門,獲取其子部門
*/
private static List<com.hqins.ishare.user.demo.Department> createChildList(com.hqins.ishare.user.demo.Department father, List<com.hqins.ishare.user.demo.Department> list) {
return list.stream().filter(model -> father.getCode().equals(model.getParentCode()))
.peek(model -> model.setChildren(createChildList(model, list)))
.sorted(Comparator.comparing(com.hqins.ishare.user.demo.Department:: getCode))
.collect(Collectors.toList());
}
/**
* 模擬數據庫查詢
* 根據公司編碼獲取公司所有部門信息
*/
private static List<com.hqins.ishare.user.demo.Department> departmentListByCompanyCode() {
List<com.hqins.ishare.user.demo.Department> result = new ArrayList<>();
com.hqins.ishare.user.demo.Department model1 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("技術部").code(10000).parentCode(0).build();
com.hqins.ishare.user.demo.Department model2 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("java開發部").code(10001).parentCode(10000).build();
com.hqins.ishare.user.demo.Department model3 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("前端技術部").code(10002).parentCode(10000).build();
com.hqins.ishare.user.demo.Department model4 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("人事部").code(10003).parentCode(0).build();
com.hqins.ishare.user.demo.Department model5 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("人事一部").code(10004).parentCode(10003).build();
com.hqins.ishare.user.demo.Department model6 = com.hqins.ishare.user.demo.Department.builder().companyCode(10086).name("人事二部").code(10005).parentCode(10003).build();
result.add(model1);
result.add(model2);
result.add(model3);
result.add(model4);
result.add(model5);
result.add(model6);
return result;
}
數據結果
[{
"children": [{
"children": [],
"code": 10001,
"companyCode": 10086,
"name": "java開發部",
"parentCode": 10000
}, {
"children": [],
"code": 10002,
"companyCode": 10086,
"name": "前端技術部",
"parentCode": 10000
}],
"code": 10000,
"companyCode": 10086,
"name": "技術部",
"parentCode": 0
}, {
"children": [{
"children": [],
"code": 10004,
"companyCode": 10086,
"name": "人事一部",
"parentCode": 10003
}, {
"children": [],
"code": 10005,
"companyCode": 10086,
"name": "人事二部",
"parentCode": 10003
}],
"code": 10003,
"companyCode": 10086,
"name": "人事部",
"parentCode": 0
}]