树形数据组装最简单的方法-Java
开发中我们经常遇到分类设计,除了表设计复杂之外,其数据组装也较为复杂
方法并不是原创,看了别的代码才有的思路,
要看懂以下代码需掌握java 8的stream和Lambda 表达式
组装有很多种方法,下面介绍一种我认为最简单的,但并不是最好理解的方法,
1、有如下表结构
比如这种常见可扩展的分类
又比如这种复杂的十级分类
2、后端如何组装呢?
2.1、以三级分类为例
2.2、第一步:数据可查出所有数据
// 1、查询所有数据->走数据库
List<PmsCategory> alldata = categorService.query(page, data);
// 2、modal 中加入List<PmsCategory> 以及其getter、setter
// 子分类
private List<PmsCategory> child;
2.3、利用强大的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;
}
3、清求测试
3.1、可以看到请求回来的数据就是我们想要的结构,父级里面嵌套子集
{
"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
}
],
}
}
以上就是对树形数据的组装思路。