Java利用TreeUtils工具類實(shí)現(xiàn)列表轉(zhuǎn)樹
一、序言
在日常一線開發(fā)過程中,總有列表轉(zhuǎn)樹的需求,幾乎是項(xiàng)目的標(biāo)配,比方說做多級(jí)菜單、多級(jí)目錄、多級(jí)分類等,有沒有一種通用且跨項(xiàng)目的解決方式呢?幫助廣大技術(shù)朋友給業(yè)務(wù)瘦身,提高開發(fā)效率。
本文將基于Java8的Lambda 表達(dá)式和Stream等知識(shí),使用TreeUtils工具類實(shí)現(xiàn)一行代碼完成列表轉(zhuǎn)樹這一通用型需求。本文有配套視頻,傳送門直達(dá)。
需要說明的是,本TreeUtils工具類已進(jìn)行三版優(yōu)化,能夠勝任生產(chǎn)場景絕大多數(shù)列表轉(zhuǎn)樹的。
二、實(shí)戰(zhàn)編碼
1、引入坐標(biāo)
本坐標(biāo)地址包含TreeUtils
工具類方法,已經(jīng)發(fā)布到Maven中央倉庫,建議使用最新的版本號(hào),本文發(fā)布時(shí)版本是1.5.8.3
,若有最新版本,建議使用最新版本。
學(xué)習(xí)源碼的朋友,源碼直通車
<dependency> <groupId>xin.altitude.cms</groupId> <artifactId>ucode-cms-common</artifactId> <version>1.5.8.3</version> </dependency>
2、編寫DO
DO是訪問數(shù)據(jù)庫實(shí)體類,屬于前期準(zhǔn)備素材。
@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é)點(diǎn)
@Data @NoArgsConstructor public class CategoryBo { private String id; private String name; private String parentId; private String remark; /** * 孩子結(jié)點(diǎn) 名字任意取 */ private List<CategoryBo> childList; /** * 實(shí)現(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é)
通過一個(gè)小小的高頻業(yè)務(wù)場景,抽離業(yè)務(wù)共性,屏蔽業(yè)務(wù)細(xì)節(jié),實(shí)現(xiàn)了通用型業(yè)務(wù)邏輯的編碼。
希望廣大技術(shù)朋友在完成日常開發(fā)工作的前提下,能夠進(jìn)一步打磨代碼,感受編程之美。
到此這篇關(guān)于Java利用TreeUtils工具類實(shí)現(xiàn)列表轉(zhuǎn)樹的文章就介紹到這了,更多相關(guān)Java TreeUtils列表轉(zhuǎn)樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java使用HttpSession實(shí)現(xiàn)QQ訪問記錄
這篇文章主要介紹了java使用HttpSession實(shí)現(xiàn)QQ的訪問記錄的相關(guān)資料,需要的朋友可以參考下2016-03-03Java 基礎(chǔ)之內(nèi)部類詳解及實(shí)例
這篇文章主要介紹了 Java 基礎(chǔ)之內(nèi)部類詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03