教你如何使用Java8实现菜单树形数据

网友投稿 238 2023-01-07

教你如何使用Java8实现菜单树形数据

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 listWithTree() {

//1.查询所有分类

List entities = baseMapper.selectList(null);

//2.组装

//2.1) 所到所有的一级类别 ,parentId = 0

List 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.使http://用递归对子分类再进行树形组装

4.1)首先判断当前的id是否有等于集合中的元素的parentId

4.2)再对当前子分类使用递归设置子分类

4.3)对当前子分类排序

4.4)返回子分类集合

详细代码实现如下:

private List getChildrens(CategoryEntity root, List all){

List treeMenus = all.stream()

//如果菜单中的父菜单Id == 当前菜单的id,则说明是子菜单

.filter(item -> Objects.equals(item.getParentCid(), root.getCatId()))

.map(item -> {

//递归添加子菜单

List 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;

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:php网站api接口开发(php编写api接口)
下一篇:美国顺达快递物流查询单号(美国顺达快递物流查询单号是什么)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~