Java利用TreeUtils工具類實現(xiàn)列表轉(zhuǎn)樹
一、序言
在日常一線開發(fā)過程中,總有列表轉(zhuǎn)樹的需求,幾乎是項目的標配,比方說做多級菜單、多級目錄、多級分類等,有沒有一種通用且跨項目的解決方式呢?幫助廣大技術(shù)朋友給業(yè)務(wù)瘦身,提高開發(fā)效率。
本文將基于Java8的Lambda 表達式和Stream等知識,使用TreeUtils工具類實現(xiàn)一行代碼完成列表轉(zhuǎn)樹這一通用型需求。本文有配套視頻,傳送門直達。
需要說明的是,本TreeUtils工具類已進行三版優(yōu)化,能夠勝任生產(chǎn)場景絕大多數(shù)列表轉(zhuǎn)樹的。
二、實戰(zhàn)編碼
1、引入坐標
本坐標地址包含TreeUtils工具類方法,已經(jīng)發(fā)布到Maven中央倉庫,建議使用最新的版本號,本文發(fā)布時版本是1.5.8.3,若有最新版本,建議使用最新版本。
學習源碼的朋友,源碼直通車
<dependency>
<groupId>xin.altitude.cms</groupId>
<artifactId>ucode-cms-common</artifactId>
<version>1.5.8.3</version>
</dependency>
2、編寫DO
DO是訪問數(shù)據(jù)庫實體類,屬于前期準備素材。
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "bu_category3")
public class Category {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO)
private String id;
private String name;
private String parentId;
private String remark;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
public Category(Category category) {
if (Objects.nonNull(category)) {
this.id = category.id;
this.name = category.name;
this.parentId = category.parentId;
this.remark = category.remark;
this.createTime = category.createTime;
this.updateTime = category.updateTime;
}
}
}
3、創(chuàng)建BO
創(chuàng)建BO數(shù)據(jù)模型用于構(gòu)造屬性結(jié)點
@Data
@NoArgsConstructor
public class CategoryBo {
private String id;
private String name;
private String parentId;
private String remark;
/**
* 孩子結(jié)點 名字任意取
*/
private List<CategoryBo> childList;
/**
* 實現(xiàn)Category 轉(zhuǎn) CategoryBo
*
* @param category
*/
public CategoryBo(Category category) {
if (Objects.nonNull(category)) {
this.id = category.getId();
this.name = category.getName();
this.parentId = category.getParentId();
this.remark = category.getRemark();
}
}
}
3、調(diào)用TreeUtils工具類
在服務(wù)層調(diào)用TreeUtils工具類,一行代碼完成轉(zhuǎn)換。
/**
* 獲取DO中指定的屬性 并構(gòu)造成樹
* @return
*/
public List<CategoryBo> selectCategory4() {
List<Category> categoryList = this.list();
List<CategoryBo> categoryBoList = EntityUtils.toList(categoryList, CategoryBo::new);
return TreeUtils.createNodeDetail(categoryBoList, "000000", CategoryBo::getId, CategoryBo::getParentId, CategoryBo::getChildList);
}
4、效果展示
原始列表數(shù)據(jù)
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": "310000",
"name": "電子商務(wù)",
"parentId": "000000",
"remark": "EEEEE",
"createTime": null,
"updateTime": "2021-11-21 11:22:40"
},
{
"id": "310100",
"name": "大宗商品",
"parentId": "310000",
"remark": "JJJJJ",
"createTime": null,
"updateTime": "2021-11-21 11:22:52"
},
{
"id": "310101",
"name": "大宗商品綜合",
"parentId": "310100",
"remark": "IIIII",
"createTime": null,
"updateTime": "2021-11-21 11:22:58"
},
{
"id": "310102",
"name": "鋼鐵類電商",
"parentId": "310100",
"remark": "OOOOO",
"createTime": null,
"updateTime": "2021-11-21 11:23:02"
},
{
"id": "310200",
"name": "綜合電商",
"parentId": "310000",
"remark": "NNNNN",
"createTime": null,
"updateTime": "2021-11-21 11:23:07"
}
]
}
樹狀層次數(shù)據(jù)
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": "310000",
"name": "電子商務(wù)",
"parentId": "000000",
"remark": "EEEEE",
"childList": [
{
"id": "310100",
"name": "大宗商品",
"parentId": "310000",
"remark": "JJJJJ",
"childList": [
{
"id": "310101",
"name": "大宗商品綜合",
"parentId": "310100",
"remark": "IIIII",
"childList": []
},
{
"id": "310102",
"name": "鋼鐵類電商",
"parentId": "310100",
"remark": "OOOOO",
"childList": []
}
]
},
{
"id": "310200",
"name": "綜合電商",
"parentId": "310000",
"remark": "NNNNN",
"childList": []
}
]
}
]
}
三、小結(jié)
通過一個小小的高頻業(yè)務(wù)場景,抽離業(yè)務(wù)共性,屏蔽業(yè)務(wù)細節(jié),實現(xiàn)了通用型業(yè)務(wù)邏輯的編碼。
希望廣大技術(shù)朋友在完成日常開發(fā)工作的前提下,能夠進一步打磨代碼,感受編程之美。
到此這篇關(guān)于Java利用TreeUtils工具類實現(xiàn)列表轉(zhuǎn)樹的文章就介紹到這了,更多相關(guān)Java TreeUtils列表轉(zhuǎn)樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用HttpSession實現(xiàn)QQ訪問記錄
這篇文章主要介紹了java使用HttpSession實現(xiàn)QQ的訪問記錄的相關(guān)資料,需要的朋友可以參考下2016-03-03

