一.簡(jiǎn)介
在項(xiàng)目開發(fā)中經(jīng)常有需要處理樹形結(jié)構(gòu)的業(yè)務(wù)需求髓涯。比如具有父子關(guān)系的數(shù)據(jù)信息建芙,而對(duì)于這種產(chǎn)品,在設(shè)計(jì)數(shù)據(jù)庫時(shí)使用id<->parentId的結(jié)構(gòu)來做届宠。為方便前端,所以在給前端數(shù)據(jù)時(shí)赐写,最好的做法就是把數(shù)據(jù)處理成treeJson格式鸟蜡。本文以公司-部門為例
以下測(cè)試基于springboot框架
二.關(guān)鍵代碼
DepartEntity 公司-部門實(shí)體類
@Data
@TableName("sys_depart")
public class DepartEntity {
private Integer departId;
private String departName;
/**
* 頂層(公司)- company 時(shí)值為0或者null
*/
private Integer parentId;
/**
* 頂層(公司)- company 次級(jí)(部門) department
*/
private String type;
/**
* 該屬性返回?cái)?shù)據(jù)時(shí)使用
*/
private List<DepartEntity> children;
}
獲取樹形結(jié)構(gòu)方法(使用jdk8 新方法,簡(jiǎn)化代碼)
private List getDepartmentTree(List list) {
<Map> groupMap = list.stream().collect(Collectors.groupingBy(DepartEntity::getType));
List companyList = groupMap.get("company");
List departmentList = groupMap.get("department");
if (companyList !=null && !companyList.isEmpty()) {
if (departmentList !=null && !departmentList.isEmpty()) {
<Map> departGroupMap = departmentList.stream().collect(Collectors.groupingBy(DepartEntity::getParentId));
for (DepartEntity company : companyList) {
company.setChildren(departGroupMap.get(company.getDepartId()));
}
}
return companyList;
}
return new ArrayList<>();
}
三.測(cè)試(數(shù)據(jù)自己造的,實(shí)際需要從數(shù)據(jù)庫表中查詢)
@GetMapping("/tree/list")
@ResponseBody
public List<DepartEntity> testTree() {
DepartEntity depart1 = new DepartEntity();
depart1.setDepartId(1);
depart1.setDepartName("公司");
depart1.setParentId(0);
depart1.setType("company");
DepartEntity depart2 = new DepartEntity();
depart2.setDepartId(2);
depart2.setDepartName("財(cái)務(wù)部");
depart2.setParentId(1);
depart2.setType("department");
DepartEntity depart3 = new DepartEntity();
depart3.setDepartId(2);
depart3.setDepartName("項(xiàng)目部");
depart3.setParentId(1);
depart3.setType("department");
ArrayList<DepartEntity> list = new ArrayList<>();
list.add(depart1);
list.add(depart2);
list.add(depart3);
return getDepartmentTree(list);
}
四.工具測(cè)試(使用Apifox測(cè)試 使用方式和postman相似)
微信圖片_20201011220049.png
treeJson格式數(shù)據(jù)
[
{
"departId": 1,
"departName": "公司",
"parentId": 0,
"sort": null,
"type": "company",
"status": null,
"createTime": null,
"children": [
{
"departId": 2,
"departName": "財(cái)務(wù)部",
"parentId": 1,
"sort": null,
"type": "department",
"status": null,
"createTime": null,
"children": null
},
{
"departId": 2,
"departName": "項(xiàng)目部",
"parentId": 1,
"sort": null,
"type": "department",
"status": null,
"createTime": null,
"children": null
}
]
}
]