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集合转换为树结构数据(本工具类扩展操作树 ...
随机推荐
- Yarn上运行spark-shell和spark-sql命令行
spark-shell On Yarn spark-shell \ --master yarn-client \ --executor-memory 1G \ --num-executors 10 s ...
- 创建x11vnc系统进程
〇.前言 为方便使用vnc,所以寻找到一个比较好用的vnc服务端那就是x11vnc,索性就创建了一个系统进程 一.环境 系统:银河麒麟v4-sp2-server 软件:x11vnc[linux下].V ...
- Kubernetes 监控--Grafana
前面我们使用 Prometheus 采集了 Kubernetes 集群中的一些监控数据指标,我们也尝试使用 promQL 语句查询出了一些数据,并且在 Prometheus 的 Dashboard 中 ...
- logstash知识点
Logstash是位于Data和Elasticsearch之间的一个中间件.Logstash是一个功能强大的工具,可与各种部署集成. 它提供了大量插件. 它从数据源实时地把数据进行采集,可帮助您解析, ...
- Traefik2.3.x 使用大全(更新版)
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488793&idx=1&sn=bb2b0ad1 ...
- 监控Redis集群,有两种方法
前提条件 redis集群:已搭建三主三从(三台主机) prometheus.grafana已安装 三台主机ip: 192.168.0.39,192.168.0.164,192.168.0.68 第一种 ...
- KVM更改虚拟机默认存储路径
Virt默认的虚拟机存储路径是/var/lib/libvirt/images,如下图所示 接下来我们创建一个新的存储池,用来存储新建的虚拟机.存储池的名称为vm, 路径为/home/kvm/ (/ho ...
- Elasticsearch集群管理之添加、删除节点
1.问题抛出 1.1 新增节点问题 我的群集具有黄色运行状况,因为它只有一个节点,因此副本保持未分配状态,我想要添加一个节点,该怎么弄? 1.2 删除节点问题 假设集群中有5个节点,我必须在运行时删除 ...
- 第六章:Django 综合篇 - 8:信号 signal
django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...
- js内置禁用按钮 disabled
按钮在监听到disabled后面的布尔值就可以实现是否禁用 一: <button :disabled="book.count <= 1" @click="de ...