Java中将List转为树形结构的三种方法

Mapper文件

    <resultMap id="nestedCategory" type="com.baizhi.mybatisplus.entity.vo.ProductCategoryVo">
        <id property="id" column="id"/>
        <result property="title" column="title"/>
        <result property="sort" column="sort"/>
        <collection property="children"
                    ofType="com.baizhi.mybatisplus.entity.vo.ProductCategoryVo"
                    select="selectNestedListByParentId"
                    column="id" />
    </resultMap>
    <select id="selectNestedListByParentId" resultMap="nestedCategory">
        select id,sort,title from tbl_product_category where parent_id = ${parent_id}
    </select>

常规写法

	@Override
	public List<ProductCategoryVo> listWithTree() {
	
		List<ProductCategory> allMenu = baseMapper.selectList(null);
		List<ProductCategoryVo> rootMenu = new ArrayList<>();
	
		for (ProductCategoryVo menu : allMenu) {
			if(menu.getParentId().equals("0")){
				rootMenu.add(menu);
			}
		}
	
		for (ProductCategoryVo nav : rootMenu) {
			List<ProductCategoryVo> childList = getChildren(nav.getId(),allMenu);
			nav.setChildren(childList);
		}
		return rootMenu;
	}
	
	private List<ProductCategoryVo> getChildren(String id, List<ProductCategoryVo> allMenu) {
		List<ProductCategoryVo> childList = new ArrayList<>();
		for (ProductCategoryVo nav : allMenu) {
			if(nav.getParentId().equals(id)){
				childList.add(nav);
			}
		}
		for (ProductCategoryVo nav : childList) {
			nav.setChildren(getChildren(nav.getId(),allMenu));
		}
		if(childList.size()==0){
			return new ArrayList<ProductCategoryVo>();
		}
		return childList;
	}

Stream流处理

    @Override
    public List<CategoryEntity> listWithTree() {
        // 1、查出所有分类
        List<CategoryEntity> entities = baseMapper.selectList(null);

        // 组装成父子的树形结构

        return entities.stream().filter(m1 ->
            m1.getParentCid() == 0
        ).peek(menu -> {
            menu.setChildren(getChildren(menu, entities));
        }).sorted((menu1,menu2)->{
            return (menu1.getSort()==null?0:menu1.getSort())-(menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());
    }

    private List<CategoryEntity> getChildren(CategoryEntity root, List<CategoryEntity> all) {
        return all.stream().filter(m1 -> {
            return m1.getParentCid().equals(root.getCatId());
        }).peek(m1 -> {
            m1.setChildren(getChildren(m1, all));
        }).sorted((menu1,menu2)->{
            return (menu1.getSort()==null?0:menu1.getSort())-(menu2.getSort()==null?0:menu2.getSort());
        }).collect(Collectors.toList());
    }
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值