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

作者:lovoo 时间:2022-09-11 12:29:22 

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<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
投稿

猜你喜欢

  • Mybatis分页插件PageHelper的配置和简单使用方法(推荐)

    2022-03-20 06:34:55
  • HashMap的get()方法的NullPointerException问题

    2023-09-23 07:24:12
  • SpringBoot整合SSO(single sign on)单点登录

    2022-02-02 03:39:40
  • Spring定时任务使用及如何使用邮件监控服务器

    2023-01-12 16:38:58
  • 布隆过滤器面试如何快速判断元素是否在集合里

    2022-10-17 15:55:19
  • Android四大组件之broadcast广播使用讲解

    2023-07-27 12:41:50
  • 在Flutter中制作翻转卡片动画的完整实例代码

    2023-06-23 23:31:21
  • Java函数式编程(十二):监控文件修改

    2022-08-11 10:21:01
  • java中常见的死锁以及解决方法代码

    2023-04-07 19:47:30
  • SpringBoot2整合activiti6环境搭建过程解析

    2023-11-09 02:27:03
  • java与c#的语法区别详细介绍

    2022-05-02 14:01:10
  • 关于使用Mybatisplus自带的selectById和insert方法时的一些问题

    2023-11-01 14:15:42
  • java生成图片验证码实例代码

    2022-01-06 04:01:37
  • Springmvc模式上传和下载与enctype对比

    2022-11-08 09:14:17
  • Java封装的实现访问限定符、包

    2023-03-20 07:08:48
  • SpringBoot 创建web项目并部署到外部Tomcat

    2023-09-15 18:25:04
  • 浅谈Java三大框架与应用

    2023-04-16 18:25:01
  • 解决jmap命令打印JVM堆信息异常的问题

    2023-11-05 09:07:02
  • Java线程池源码的深度解析

    2023-10-02 19:33:40
  • Java Spring MVC 上传下载文件配置及controller方法详解

    2023-11-22 04:13:59
  • asp之家 软件编程 m.aspxhome.com