TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频
一、序言
在日常一线开发过程中,总有列表转树
的需求,几乎是项目的标配,比方说做多级菜单、多级目录、多级分类等,有没有一种通用且跨项目的解决方式呢?帮助广大技术朋友给业务瘦身,提高开发效率。
本文将基于Java8的Lambda 表达式和Stream等知识,使用TreeUtils
工具类实现一行代码完成列表转树这一通用型需求。本文有配套视频,传送门直达。
需要说明的是,本TreeUtils工具类已进行三版优化,能够胜任生产场景绝大多数列表转树的。
二、实战编码
1、引入坐标
本坐标地址包含TreeUtils
工具类方法,已经发布到Maven中央仓库,建议使用最新的版本号,本文发布时版本是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是访问数据库实体类,属于前期准备素材。
@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、创建BO
创建BO数据模型用于构造属性结点
@Data
@NoArgsConstructor
public class CategoryBo {
private String id;
private String name;
private String parentId;
private String remark;
/**
* 孩子结点 名字任意取
*/
private List<CategoryBo> childList;
/**
* 实现Category 转 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、调用TreeUtils工具类
在服务层调用TreeUtils工具类,一行代码完成转换。
/**
* 获取DO中指定的属性 并构造成树
* @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、效果展示
原始列表数据
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": "310000",
"name": "电子商务",
"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"
}
]
}
树状层次数据
{
"code": 200,
"msg": "操作成功",
"data": [
{
"id": "310000",
"name": "电子商务",
"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": []
}
]
}
]
}
三、小结
通过一个小小的高频业务场景,抽离业务共性,屏蔽业务细节,实现了通用型业务逻辑的编码。
希望广大技术朋友在完成日常开发工作的前提下,能够进一步打磨代码,感受编程之美。
TreeUtils工具类一行代码实现列表转树【第三版优化】 三级菜单 三级分类 附视频的更多相关文章
- 分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解
[博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708]http ...
- [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版
(课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...
- 使用JCrop进行图片裁剪,裁剪js说明,裁剪预览,裁剪上传,裁剪设计的图片处理的工具类和代码
1.要想制作图片裁剪功能,可以使用网上的裁剪工具JCrop,网址是:https://github.com/tapmodo/Jcrop/ 案例效果如下: 2.引入JCrop的js代码,具体要引入那 ...
- html便民查询各个工具类实例代码分享(支持pc和移动端)
1.手机号码查询 <iframe id="api_iframe_51240" name="api_iframe_51240" src="&quo ...
- android开发时间和日期的代码实现工具类(一)
android开发时间和日期工具类的代码实现: package com.gzcivil.utils; import android.annotation.SuppressLint; import an ...
- xml与java代码相互装换的工具类
这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你定义好了xml的模板,就能一键生成java代码.省下了自己再使用工具类写代 ...
- Workbook导出excel封装的工具类
在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...
- java(List或Array数组)求交集、并集、差集, 泛型工具类
业务需要求不同类型的交集.并集.差集为避免代码冗余编写工具类. 注:list 转数组需传入数组,如果将原数组传入将会改变原数组的值,同时泛型数组又不可以实例化,解决方案:Arrays.copyOf(n ...
- JDBC工具类连接数据库,模仿登录
## 使用JDBC工具类的原因在使用JDBC连接数据库的时候,加载驱动.获取连接.释放资源等代码是重复的,所有为了提高代码的复用性,我们可以写一个工具类,将数据库驱动加载.获取连接.资源释放的代码封装 ...
- java树形结构工具类
一.树形结构数据一般都是以子父id的形式存在数据库中,查询的时候只是带有子id和parent_id的List集合 并不是树形结构,所以我们现在要将普通的List集合转换为树结构数据(本工具类扩展操作树 ...
随机推荐
- 【Git进阶】基于文件(夹)拆分大PR
背景 前段时间为了迁移一个旧服务到新项目,由此产生了一个巨大的PR,为了方便Code Review,最终基于文件夹,将其拆分成了多个较小的PR:现在这里记录下,后面可能还会需要. 演示 为了方便演示, ...
- nginx配置文件安全设置--重要
防止Nginx头部攻击漏洞和恶意域名解析漏洞 在nginx主配置文件中,写第一个server,server_name用默认default_server,让所有未匹配的server_name,都走这个s ...
- 使用growpart扩容CentOS虚拟机磁盘
说明 一块磁盘,比如有130G,但是只有100G拿来用了,安装俩分区,一个是swap,另一个是根分区/,根分区采用的是LVM逻辑卷管理. 现在要做的是把剩余的这空闲30G分配给根分区使用 这个并不是新 ...
- My life of Honker Security Commando
红客突击队 && 红客突击分队 红客突击队,于2019年,由队长k龙联合国内多位顶尖高校研究生牵头成立.其团队从成立至今多次参加国际网络安全竞赛并取得良好成绩,积累了丰富的竞赛经验.团 ...
- 请推荐下比较适合中小企业的ERP系统,如odoo,除前期开发和不定期完善,有没有其他固定月费或年费?
odoo的话你自己就可以下载开源的安装使用的啊,如果你要别人帮你开发和完善做技术服务的话一般都还是要年费的,主要是因为要帮你做维护或修bug什么的,自己能搞定的话自然不需要的哦.只是odoo使用的是p ...
- python_flask开发环境设置
flask开发环境设置,在powershell终端窗口,可以通过一下方式设置: # 设置当前app实例 $env:FLASK_APP="app:create_app()" #将当前 ...
- 使用 Apache Hudi 实现 SCD-2(渐变维度)
数据是当今分析世界的宝贵资产. 在向最终用户提供数据时,跟踪数据在一段时间内的变化非常重要. 渐变维度 (SCD) 是随时间推移存储和管理当前和历史数据的维度. 在 SCD 的类型中,我们将特别关注类 ...
- kali配置
IP设置 配置文件:/etc/networking/interface 临时IP ifconfig eth0 192.168.31.111/24 永久IP auto eth0 #iface eth0 ...
- Android 13 新特性及适配指南
Android 13(API 33)于 2022年8月15日 正式发布(发布时间较往年早了一些),正式版Release源代码也于当日被推送到AOSP Android开源项目. 截止到笔者撰写这篇文章时 ...
- python实现多接口翻译软件
本实验用pyqt5做了一个小软件,里面使用了市面上主流的6种翻译软件接口:谷歌.百度.有道.金山词霸.腾讯.必应,界面如图所示: 以下是程序代码: import time,sys,os,hashlib ...