開發中我們經常遇到分類設計,除了表設計復雜之外,其數據組裝也較為復雜
方法並不是原創,看了別的代碼才有的思路,
要看懂以下代碼需掌握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
}
],
}
}
以上就是對樹形數據的組裝思路。