组建树形结构
1. 以三级分类为例
第一步:数据可查出所有数据
// 1、查询所有数据->走数据库
List<PmsCategory> alldata = categorService.query(page, data);
// 2、modal 中加入List<PmsCategory> 以及其getter、setter
// 子分类
private List<PmsCategory> child;
stream流进行处理
public List<PmsCategory> queryListTree(){
// 1、1、查询所有数据->走数据库
List<PmsCategory> pmsCategories = categoryDao.selectByExample(pmsCategoryAll);
// 2、找到一级分类 判断条件是parentCid == 0 或者level ==1
List<PmsCategory> collect = alldata.stream().filter((category) -> {
return category.getParentCid() == 0;
}).map((meun) -> {
//2、调用查询子数据
meun.setChild(child(meun,alldata));
return meun;
}).sorted((menu1,meun2) ->{
// 排序可自定义
return (menu1.getSort() == null?0:menu1.getSort()) - (meun2.getSort() == null?0:meun2.getSort());
}).collect(Collectors.toList());
return collect;
}
private List<PmsCategory> child(PmsCategory root,List<PmsCategory> pmsCategories){
List<PmsCategory> collect = pmsCategories.stream().filter((category) -> {
return category.getParentCid().equals(root.getCatId());
}).map((category) -> {
// 找到子数据,注意这里式递归查找,子集有可能还有子集
category.setChild(child(category, pmsCategories));
return category;
}).sorted((menu1, menu2) -> {
// 也可以子那个规则排序
return (menu1.getSort() == null?0:menu1.getSort()) - (menu2.getSort() == null?0:menu2.getSort());
}).collect(Collectors.toList());
return collect;
}
清求测试,可以看到请求回来的数据就是我们想要的结构,父级里面嵌套子集
{
"riestcode": 0,
"riestmsg": "success",
"retdata": {
"datalist": [
{
"catId": 2,
"name": "手机",
"parentCid": 0,
"catLevel": 1,
"showStatus": 1,
"sort": 0,
"icon": null,
"productUnit": null,
"productCount": 0,
"child": [
{
"catId": 34,
"name": "手机通讯",
"parentCid": 2,
"catLevel": 2,
"showStatus": 1,
"sort": 0,
"icon": null,
"productUnit": null,
"productCount": 0,
"child": [
{
"catId": 226,
"name": "对讲机",
"parentCid": 34,
"catLevel": 3,
"showStatus": 1,
"sort": 0,
"icon": null,
"productUnit": null,
"productCount": 0,
"child": [],
"catidlists": null
},
{
"catId": 1437,
"name": "1226测试",
"parentCid": 34,
"catLevel": 3,
"showStatus": 1,
"sort": null,
"icon": "xxx",
"productUnit": "件",
"productCount": null,
"child": [],
"catidlists": null
},
{
"catId": 1438,
"name": "1226测试-03",
"parentCid": 34,
"catLevel": 3,
"showStatus": 1,
"sort": null,
"icon": "xxx",
"productUnit": "件",
"productCount": null,
"child": [],
"catidlists": null
},
{
"catId": 1439,
"name": "1226测试",
"parentCid": 34,
"catLevel": 3,
"showStatus": 1,
"sort": null,
"icon": "xxx",
"productUnit": "件",
"productCount": null,
"child": [],
"catidlists": null
}
],
}
}
以上是我效仿的例子,下面是我的代码
@Override
public IPage<FDynamicCostVO> detailAll(FDynamicCostQO qo) {
IPage<FDynamicCostVO> list = fDynamicCostMapper.detailAll(qo.buildPage(), qo);
List<FDynamicCostVO> records = list.getRecords();
//组装树形结构
List<FDynamicCostVO> collect = records.stream()
.filter(e -> e.getNodeNum() == 1)
.map(a -> a.setChildList(child(a, records))) //这里需要注意,直接set会报错
.collect(Collectors.toList());
list.setRecords(collect);
return list;
}
直接set会报错,因为set的返回值是void,而map需要一个返回值
这个时候需要一个注解的帮助,@Accessors(chain = true)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf9fa87880f94365902ebeaa319430e5.png
@Accessors(chain = true) //开启链式编程,setter方法返回的是this(也就是对象自己),代替了默认的返回值void
否则像上面的方式return一下也可以
{
"id":"1745330167158247426",
"createId":70551,
"createTime":"2024-01-11 14:21:53",
"updateTime":"2024-01-11 14:22:46",
"dataStatus":1,
"companyName":null,
"projectName":"yy1221-1项目名称",
"companyCode":"CC19-0018",
"projectCode":"yy1221-1bianhao",
"overallAmount":0,
"overallAmountOneOrTwo":0,
"overallAmountView":"0.00",
"overallAmountOneOrTwoView":"0.00",
"dynamicCost":0,
"dynamicCostOneOrTwo":0,
"dynamicCostView":"0.00",
"dynamicCostOneOrTwoView":"0.00",
"difference":0,
"differenceOneOrTwo":0,
"differenceView":"0.00",
"differenceOneOrTwoView":"0.00",
"num":"CBLX11",
"upNode":null,
"upNodeName":null,
"upNodeNameAll":null,
"nodeNum":1,
"differenceText":null,
"costType":"1",
"parentId":0,
"rulesCategory":null,
"childList":[
{
"id":"1745330220727898114",
"createId":70551,
"createTime":"2024-01-11 14:22:06",
"updateTime":"2024-01-11 14:22:46",
"dataStatus":1,
"companyName":null,
"projectName":"yy1221-1项目名称",
"companyCode":"CC19-0018",
"projectCode":"yy1221-1bianhao",
"overallAmount":0,
"overallAmountOneOrTwo":0,
"overallAmountView":"0.00",
"overallAmountOneOrTwoView":"0.00",
"dynamicCost":0,
"dynamicCostOneOrTwo":0,
"dynamicCostView":"0.00",
"dynamicCostOneOrTwoView":"0.00",
"difference":0,
"differenceOneOrTwo":0,
"differenceView":"0.00",
"differenceOneOrTwoView":"0.00",
"num":"CBLX11-1",
"upNode":null,
"upNodeName":null,
"upNodeNameAll":null,
"nodeNum":2,
"differenceText":"12",
"costType":"12",
"parentId":"1745330167158247426",
"rulesCategory":null,
"childList":[
{
"id":"1745330386436460546",
"createId":70551,
"createTime":"2024-01-11 14:22:45",
"updateTime":"2024-01-11 14:22:46",
"dataStatus":1,
"companyName":null,
"projectName":"yy1221-1项目名称",
"companyCode":"CC19-0018",
"projectCode":"yy1221-1bianhao",
"overallAmount":0,
"overallAmountOneOrTwo":0,
"overallAmountView":"0.00",
"overallAmountOneOrTwoView":"0.00",
"dynamicCost":0,
"dynamicCostOneOrTwo":0,
"dynamicCostView":"0.00",
"dynamicCostOneOrTwoView":"0.00",
"difference":0,
"differenceOneOrTwo":0,
"differenceView":"0.00",
"differenceOneOrTwoView":"0.00",
"num":"CBLX11-1-1",
"upNode":null,
"upNodeName":null,
"upNodeNameAll":null,
"nodeNum":3,
"differenceText":null,
"costType":"1234",
"parentId":"1745330220727898114",
"rulesCategory":null,
"childList":[
]
}
]
}
]
},