教你如何使用Java8实现菜单树形数据
作者:lovoo 时间:2022-09-11 12:29:22
Java8实现菜单树形数据
当我们打开京东商城时,左侧的菜单依次分为 * 展示,这是如何实现的呢?
本篇暂不讲述前端,只讲述如何使用java8 的lamada表达式实现树形数据的拼装
1.创建菜单表
CREATE TABLE `pms_category` (
`cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',
`name` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类名称',
`parent_cid` bigint(20) NULL DEFAULT NULL COMMENT '父分类id',
`cat_level` int(11) NULL DEFAULT NULL COMMENT '层级',
`show_status` tinyint(4) NULL DEFAULT NULL COMMENT '是否显示[0-不显示,1显示]',
`sort` int(11) NULL DEFAULT NULL COMMENT '排序',
`icon` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标地址',
`product_unit` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计量单位',
`product_count` int(11) NULL DEFAULT NULL COMMENT '商品数量',
PRIMARY KEY (`cat_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1433 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品 * 分类' ROW_FORMAT = Dynamic;
2.创建实体类
其中children用来存放子类
@Data
@TableName("pms_category")
public class CategoryEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 分类id
*/
@TableId
private Long catId;
/**
* 分类名称
*/
private String name;
/**
* 父分类id
*/
private Long parentCid;
/**
* 层级
*/
private Integer catLevel;
/**
* 是否显示[0-不显示,1显示]
*/
private Integer showStatus;
/**
* 排序
*/
private Integer sort;
/**
* 图标地址
*/
private String icon;
/**
* 计量单位
*/
private String productUnit;
/**
* 商品数量
*/
private Integer productCount;
/**
* 子分类
*/
@TableField(exist = false)
private List<CategoryEntity> children;
}
3.实现一级分类
3.1)首先要查询出所有的分类信息entities
3.2)然后对entities过滤查找一级分类,其中一级分的parentId == 0
3.3)设置当前一级分类的子分类
3.4)对一级分类进行排序
代码如下:
public List<CategoryEntity> listWithTree() {
//1.查询所有分类
List<CategoryEntity> entities = baseMapper.selectList(null);
//2.组装
//2.1) 所到所有的一级类别 ,parentId = 0
List<CategoryEntity> levelOneMenus = entities.stream()
.filter(item -> item.getParentCid() == 0)
.map(item -> {
item.setChildren(this.getChildrens(item, entities));
return item;
})
.sorted((item1, item2) -> {
return (item1.getSort() == null ? 0 : item1.getSort()) - (item2.getSort() == null ? 0 : item2.getSort());
})
.collect(Collectors.toList());
return levelOneMenus;
}
4.使用递归对子分类再进行树形组装
4.1)首先判断当前的id是否有等于集合中的元素的parentId
4.2)再对当前子分类使用递归设置子分类
4.3)对当前子分类排序
4.4)返回子分类集合
详细代码实现如下:
private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all){
List<CategoryEntity> treeMenus = all.stream()
//如果菜单中的父菜单Id == 当前菜单的id,则说明是子菜单
.filter(item -> Objects.equals(item.getParentCid(), root.getCatId()))
.map(item -> {
//递归添加子菜单
List<CategoryEntity> childrens = getChildrens(item, all);
item.setChildren(childrens);
return item;
})
//排序
.sorted((item1, item2) -> {
return (item1.getSort() == null ? 0 : item1.getSort()) - (item2.getSort() == null ? 0 : item2.getSort());
})
.collect(Collectors.toList());
return treeMenus;
}
来源:https://blog.csdn.net/lovoo/article/details/117914022
标签:Java,菜单树形,数据
0
投稿
猜你喜欢
Java 如何实现解压缩文件和文件夹
2023-07-17 23:10:22
JAVA代码实现MongoDB动态条件之分页查询
2022-05-21 12:44:11
C#中实现网段扫描的代码
2022-05-09 03:54:33
Java基于Tcp协议的socket编程实例
2022-03-08 00:04:13
Java实现导出word表格的示例详解
2023-01-02 21:36:48
C#如何利用反射将枚举绑定到下拉框详解
2022-09-12 01:48:09
Java使用DOM4j实现读写XML文件的属性和元素
2021-10-19 00:21:52
Java获取用户IP属地模拟抖音详解
2023-04-18 02:01:29
FeignClient如何脱离eureka自定义URL
2022-08-27 01:37:25
Java多线程Future松获取异步任务结果轻松实现
2022-11-22 15:49:38
Java查找不重复无序数组中是否存在两个数字的和为某个值
2023-08-22 16:44:40
springboot+jwt+springSecurity微信小程序授权登录问题
2022-10-13 03:36:22
关于C#线程的全面解析
2021-08-14 11:14:59
教你如何使用platform密钥对apk进行签名
2023-12-09 06:10:59
Java创建类模式_动力节点Java学院整理
2023-04-15 23:11:55
C语言时间函数之strftime()详解
2023-06-26 02:42:32
springboot为异步任务规划自定义线程池的实现
2022-12-05 01:13:02
springboot整合kaptcha生成验证码功能
2023-07-14 21:48:51
C#中应用程序集的装载过程详解
2023-03-30 19:06:05
Java Socket编程(三) 服务器Sockets
2023-05-24 21:18:19