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

 更新时间:2021年06月16日 11:09:17   作者:lovoo  
今天给大家带来的是关于JAVA的相关知识,文中围绕着如何使用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;
    }

到此这篇关于教你如何使用Java8实现菜单树形数据的文章就介绍到这了,更多相关Java8实现菜单树形数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA手动添加junit4时出现的问题与解决方法

    IDEA手动添加junit4时出现的问题与解决方法

    这篇文章主要给大家介绍了关于IDEA手动添加junit4时出现的问题与解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 详解如何继承Mybatis中Mapper.xml文件

    详解如何继承Mybatis中Mapper.xml文件

    这篇文章主要为大家介绍了详解如何继承Mybatis中Mapper.xml文件,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Springboot事务失效的几种情况解读

    Springboot事务失效的几种情况解读

    这篇文章主要介绍了Springboot事务失效的几种情况解读,因为Spring AOP默认使用动态代理,会给被代理的类生成一个代理类,事务相关的操作都通过代理来完成,使用内部方法调用时,使用的是实例调用,没有通过代理类调用方法,因此事务不会检测到失败,需要的朋友可以参考下
    2023-10-10
  • Javaweb会话跟踪技术Cookie和Session的具体使用

    Javaweb会话跟踪技术Cookie和Session的具体使用

    本文主要介绍了Javaweb会话跟踪技术Cookie&Session的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 解决MyEclipse中Maven设置jdk版本jdk1.8报错问题

    解决MyEclipse中Maven设置jdk版本jdk1.8报错问题

    今天安装了jdk1.8、tomcat8、和maven3.5.2,弄好后在myeclipse新建了一个maven项目,项目默认是jdk1.5,改成jdk1.8后项目报错
    2018-10-10
  • java实现文件切片和合并的代码示例

    java实现文件切片和合并的代码示例

    这篇文章主要介绍了java实现文件切片和合并的代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 详解java面试题中的i++和++i

    详解java面试题中的i++和++i

    这篇文章主要介绍了java面试题中的i++和++i的相关资料,需要的朋友可以参考下
    2018-03-03
  • java生成彩色附logo二维码

    java生成彩色附logo二维码

    这篇文章主要为大家介绍了java生成带logo的多彩二维码,比一般二维码颜色鲜艳,美观,如何生成二维码,下面小编为大家分享实现代码,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • MySQL查询字段实现字符串分割split功能的示例代码

    MySQL查询字段实现字符串分割split功能的示例代码

    本文主要介绍了MySQL查询字段实现字符串分割split功能的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • SpringBoot下载Excel文件时,报错文件损坏的解决方案

    SpringBoot下载Excel文件时,报错文件损坏的解决方案

    这篇文章主要介绍了SpringBoot下载Excel文件时,报错文件损坏的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论