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

JAVA 同时被 2 个专栏收录
245 篇文章 0 订阅
50 篇文章 0 订阅

问题描述

 

解决方案

数据库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?

  • 0
    点赞
  • 0
    评论
  • 10
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值