教你如何使用Java8实现菜单树形数据
作者:lovoo 发布时间:2022-09-11 12:29:22
标签:Java,菜单树形,数据
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


猜你喜欢
- @AutoConfiguration读取所有jar包下的 /META-INF/spring.factories 并追加到一个 LinkedM
- 环境: VS2019 , OpencvSharp4 4.5.5.20211231 , .NET Framework 4.8界面设计:图像显示
- ①概念二叉搜索树又称二叉排序树,它或者是一棵空树**,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
- 本文实例讲述了android中Bitmap用法。分享给大家供大家参考。具体如下:在Android SDK中可以支持的图片格式如下:png ,
- 于是提出了kill process的方法,目前我见过的方法多是用进程创建时间筛选excel.exe进程,然后kill 。这样的方法
- 前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home
- maven打包指定jdk的版本问题今天遇到个问题,项目中新写了一个接口,其中用到了lambda表达式,本地跑是没问题的,但提交到gitLab
- 本文实例为大家分享了Android刮刮卡效果,供大家参考,具体内容如下android实现底层一张图片,上层一个遮罩层,触摸滑动按手指滑动路径
- 开发过程中有这样一个场景,2个 bean 初始化逻辑中有依赖关系,需要控制二者的初始化顺序。实现方式可以有多种,本文结合目前对 Spring
- wait()方法表示,放弃当前对资源的占有权,等啊等啊,一直等到有人通知我,我才会运行后面的代码。notify()方法表示,当前的线程已经放
- android通过google API获取天气信息public class WeatherActivity extends Activity
- 前言对于Java程序员,可以说对于ArrayList和LinkedList可谓是十分熟悉了对于ArrayList和LinkedList,他们
- 一次正常的请求最近别人需要调用我们系统的某一个功能,对方希望提供一个api让其能够更新数据。由于该同学是客户端开发,于是有了类似以下代码。@
- java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致。下面会讲解Spring中自定义注解的简单流程,其中会
- 使用的场景常常遇到一些项目中多环境切换的问题。比如在开发过程中用到开发环境,在测试中使用测试环境,在生产中用生产环境的情况。springbo
- 前言我在上一篇文章聊了Redisson的分布式锁,这次继续来聊聊Redisson的公平锁。下面是官方原话:它保证了当多个Redisson客户
- 导出Excel在很多项目中经常用到,本人介绍了C#实现GridView导出Excel实例代码,也全当给自己留下个学习笔记了。using Sy
- 前言自从用了SpringBoot,个人最喜欢的就是SpringBoot的配置文件了,和Spring比起SpringBoot更加灵活,修改的某
- 面试题1:Bean 的加载过程是怎样的?我们知道, Spring 的工作流主要包括以下两个环节:解析,读 xml 配置,扫描类文件,从配置或
- Java * 分析及理解代理设计模式定义:为其他对象提供一种代理以控制对这个对象的访问。 * 使用java * 机制以巧妙的方式实现了