JAVA——电子商城三级分类目录查询-递归树形数据结构

52 篇文章 2 订阅

问题描述

 

解决方案

数据库SQL

CREATE TABLE `goods_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '分类id',
  `category_level` tinyint(4) NOT NULL DEFAULT '0' COMMENT '分类级别(1-一级分类 2-二级分类 3-三级分类)',
  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父分类id',
  `category_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',
  `category_rank` int(11) NOT NULL DEFAULT '0' COMMENT '排序值(字段越大越靠前)',
  `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标识字段(0-未删除 1-已删除)',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `create_user` int(11) NOT NULL DEFAULT '0' COMMENT '创建者id',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  `update_user` int(11) DEFAULT '0' COMMENT '修改者id',
  PRIMARY KEY (`id`) USING BTREE
) 

Service

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ShenTuZhiGang
 * @since 2020-11-08
 */
@Service
public class GoodsCategoryServiceImpl extends ServiceImpl<GoodsCategoryMapper, GoodsCategory> implements IGoodsCategoryService {
    @Autowired
    private GoodsCategoryMapper goodsCategoryMapper;
    @Override
    public List<GoodsCategory> listWithTree() {
        //1、查出所有分类
        List<GoodsCategory> entities = goodsCategoryMapper.selectList(null);

        //2、组装成父子的树形结构
        //2.1找到所有的一级分类
        List<GoodsCategory> level1Menus = entities.stream()
                .filter((goodsCategory) -> goodsCategory.getParentId() == 0)
                .peek((menu)-> menu.setChildren(getChildren(menu,entities)))
                .sorted((menu1,menu2)->(menu1.getCategoryRank()==null?0:menu1.getCategoryRank()) - (menu2.getCategoryRank()==null?0:menu2.getCategoryRank()))
                .collect(Collectors.toList());

        return level1Menus;
    }
    //递归查找所有菜单的子菜单
    private List<GoodsCategory> getChildren(GoodsCategory root,List<GoodsCategory> all){
        List<GoodsCategory> child = all.stream()
                .filter(GoodsCategory -> GoodsCategory.getParentId().equals( root.getId()))
                //找到子菜单
                .peek(GoodsCategory -> GoodsCategory.setChildren(getChildren(GoodsCategory, all)))
                //菜单的排序
                .sorted((menu1,menu2)->(menu1.getCategoryRank())==null?0:menu1.getCategoryRank() - (menu2.getCategoryRank()==null?0:menu2.getCategoryRank()))
                .collect(Collectors.toList());
        return child.isEmpty()?null:child;
    }

}

 

参考文章

三级目录查询代码

电商项目——如何查出所有三级分类,并以树形结构组装起来?

三级分-类查询-递归树形结构数据获取

Java 8 Stream peek 与 map的区别

mybatis查询返回一个三级目录

Java的Stream.collect()是否可以返回null?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Starzkg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值