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递归实现类别树内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一篇文章带你入门java面向对象

    一篇文章带你入门java面向对象

    这篇文章主要介绍了Java语言面向对象编程思想之类与对象实例详解,还是十分不错的,这里给大家分享下,需要的朋友可以参考,希望能帮到你
    2021-08-08
  • Springboot导入本地jar后 打包依赖无法加入的解决方案

    Springboot导入本地jar后 打包依赖无法加入的解决方案

    这篇文章主要介绍了Springboot导入本地jar后 打包依赖无法加入的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java多线程读取多个文件的方法

    java多线程读取多个文件的方法

    这篇文章主要为大家详细介绍了java多线程读取多个文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java并发系列之Semaphore源码分析

    Java并发系列之Semaphore源码分析

    这篇文章主要为大家详细介绍了Java并发系列之Semaphore源码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java中Spring获取bean方法小结

    Java中Spring获取bean方法小结

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • Java设置token有效期的5个应用场景(双token实现)

    Java设置token有效期的5个应用场景(双token实现)

    Token最常见的应用场景之一就是身份验证,本文主要介绍了Java设置token有效期的5个应用场景(双token实现),具有一定的参考价值,感兴趣的可以来了解一下
    2024-04-04
  • JDBC使用游标实现分页查询的方法

    JDBC使用游标实现分页查询的方法

    这篇文章主要介绍了JDBC使用游标实现分页查询的方法,实例分析了jdbc查询过程中游标的使用及查询分页相关实现技巧,需要的朋友可以参考下
    2016-08-08
  • 详解如何在Java中实现懒加载

    详解如何在Java中实现懒加载

    懒加载是一种常见的优化技术,它可以延迟对象的创建或初始化,直到对象第一次被使用时才进行。在本文中,我们将介绍如何使用 Java 中的 Supplier 接口和双重检查锁定模式来实现懒加载,并保证只初始化一次,希望对大家有所帮助
    2023-03-03
  • IDEA导入Eclipse项目的方法步骤(图文教程)

    IDEA导入Eclipse项目的方法步骤(图文教程)

    这篇文章主要介绍了IDEA导入Eclipse项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Jackson处理Optional时遇到问题的解决与分析

    Jackson处理Optional时遇到问题的解决与分析

    Optional是Java实现函数式编程的强劲一步,并且帮助在范式中实现,但是Optional的意义显然不止于此,下面这篇文章主要给大家介绍了关于Jackson处理Optional时遇到问题的解决与分析的相关资料,需要的朋友可以参考下
    2022-02-02

最新评论