java利用递归实现类别树示例代码

 更新时间:2020年12月17日 09:23:33   作者:去撒哈拉当海盗  
这篇文章主要给大家介绍了关于java利用递归实现类别树的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在浏览淘宝,京东等各大商场的时候会发现首页一般都是商品分类,并且这个商品分类都是层级关系。下图以天猫商场为例,分为了三层的树状结构!!!

那么这种的类别树是怎么实现的呢?话不多说直接上代码:

1.首先我们新建一张商品类别表并维护所需数据:

2.创建商品类别实体

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel("商品类别表")
public class OrdersCategory implements Serializable {

	private static final long serialVersionUID = 1L;

 @ApiModelProperty(value = "类别主键")
 @TableId(value = "id", type = IdType.ASSIGN_ID)
 private Integer catId;

 @ApiModelProperty(value = "分类名称")
 private String name;

 @ApiModelProperty(value = "父分类id")
 private Integer parentCid;

 @ApiModelProperty(value = "层级")
 private Integer catLevel;

 @ApiModelProperty(value = "是否显示[0-不显示,1显示]")
 private Integer showStatus;

 @ApiModelProperty(value = "排序")
 private Integer sort;

 @ApiModelProperty(value = "图标地址")
 private String icon;

 @ApiModelProperty(value = "计量单位")
 private String productUnit;

 @ApiModelProperty(value = "商品数量")
 private String productCount;
}

3.创建类别树返回实体

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel("商品类别返回对象")
public class OrdersCategoryVo extends OrdersCategory implements Serializable {

 private static final long serialVersionUID = 1L;

 @ApiModelProperty(value = "子类别树")
 List<OrdersCategoryVo> childrenCategoryList;
}

4.递归逻辑代码编写

 /**
  * 获取商品类别树
  * @return
  */
 @Override
 public List<OrdersCategoryVo> getCategoryTree() {
  //查出分类表所有数据
  List<OrdersCategoryVo> entityList = categoryMapper.getCategoryTreeAll();
  //查询出所有的一级分类数据. 使用stream的api
  List<OrdersCategoryVo> firstEntityList = entityList.stream()
  	.filter(categoryVo -> categoryVo.getParentCid().intValue() == 0)
  	.map((menu) -> {
   //传递当前的商品分类, 和所有的分类,递归查询出每个一级分类下的子分类
   menu.setChildrenCategoryList( getChildrens(menu,entityList));
   return menu;
  } ).collect(Collectors.toList());
  return firstEntityList;
 }

 /**
  * 递归查询子父类
  * @param root 当前节点的父id
  * @param all 所有的商品分类
  * @return
  */
 private List<OrdersCategoryVo> getChildrens(OrdersCategoryVo root, List<OrdersCategoryVo> all) {
  List<OrdersCategoryVo> childrenList = all.stream()
  	.filter(categoryVo -> categoryVo.getParentCid().intValue() == root.getCatId().intValue())
  	.map(categoryVo -> {
   //子菜单可能还有子菜单, 因此递归查询 , 查询出子菜单
   categoryVo.setChildrenCategoryList(getChildrens(categoryVo, all));
   return categoryVo;
  }).collect(Collectors.toList());

  return childrenList;
 }

关于实现逻辑,代码上都有注释,这里简单讲一下案例中stream的几个方法

stream().filter:过滤,根据条件过滤掉集合中的元素

stream().map:映射,操作集合中的元素并返回新的元素

stream().collect(Collectors.toList()):结束操作,stream流无存储,所以需要返回操作结束后的集合

5.前端使用Element的树形控件渲染数据

<template>
 <el-tree :data="data" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
</template>

<script>
import { getCategoryTree } from '@/api/category'

export default {
 data() {
 return {
  data: [],
  defaultProps: {
   children: 'childrenCategoryList',
   label: 'name'
  }
 }
 },
 created() {
  this.getData();
 },
 methods: {
 handleNodeClick () {

 },
 getData() {
  getCategoryTree()
  .then(response => {
   this.data = response.data.data.list
  })
  .catch(() => {
   this.data = []
  })
 }
 }

6.启动项目看效果

初学前端,做的比较简单。。。。。。。。。。。。。

到此这篇关于java利用递归实现类别树的文章就介绍到这了,更多相关java递归实现类别树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • jvm堆外内存排查图文举例详解

    jvm堆外内存排查图文举例详解

    Java应用程序通过直接方式从操作系统中申请的内存,叫堆外内存,这篇文章主要给大家介绍了关于jvm堆外内存排查的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 浅析Spring基于注解的AOP

    浅析Spring基于注解的AOP

    Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利
    2022-11-11
  • SpringBoot中Redis的缓存更新策略详解

    SpringBoot中Redis的缓存更新策略详解

    这篇文章主要介绍了SpringBoot中Redis的缓存更新策略,缓存一般是为了应对高并发场景、缓解数据库读写压力,而将数据存储在读写更快的某种存储介质中(如内存),以加快读取数据的速度,需要的朋友可以参考下
    2023-08-08
  • 使用ServletInputStream在拦截器或过滤器中应用后重写

    使用ServletInputStream在拦截器或过滤器中应用后重写

    这篇文章主要介绍了使用ServletInputStream在拦截器或过滤器中应用后重写,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 基于java中两个对象属性的比较

    基于java中两个对象属性的比较

    下面小编就为大家带来一篇基于java中两个对象属性的比较。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 详谈java线程与线程、进程与进程间通信

    详谈java线程与线程、进程与进程间通信

    下面小编就为大家带来一篇详谈java线程与线程、进程与进程间通信。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 教你bat脚本一键配置java开发环境

    教你bat脚本一键配置java开发环境

    公司新入职一名员工,项目经理让我安排新人工作,首先需要对java开发相关环境进行配置安装,但时常会因为安装配置不到位或者操作错误导致时间的浪费,所以在空余时间收集了一系列软件的免安装版本,感兴趣的朋友一起看看吧
    2021-12-12
  • 编译期动态替换三方包中的Class文件过程详解

    编译期动态替换三方包中的Class文件过程详解

    这篇文章主要为大家介绍了编译期动态替换三方包中的Class文件过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • IntelliJ IDEA使用SVN分支的简单介绍

    IntelliJ IDEA使用SVN分支的简单介绍

    今天小编就为大家分享一篇关于IntelliJ IDEA使用SVN分支的简单介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Spring Boot开发Web应用详解

    Spring Boot开发Web应用详解

    这篇文章主要介绍了Spring Boot开发Web应用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04

最新评论