java 获取树结构的几种方式

该博客介绍了如何使用MyBatis在SQL查询中构建树形数据结构,以及如何通过Java8的Stream API实现相同功能。通过`<resultMap>`配置和递归查询,MyBatis可以获取层级关系的数据。而在Java8中,利用流和过滤操作,可以动态构建父节点及其子节点的树结构。这两种方法展示了在不同场景下处理树形数据的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mybatis版本 树结构数据获取:

<resultMap id="treeMap" type="com.productOrder.domain.MDirectoryMenuVo" >
        <result column="id" property="id" />
        <result column="dir_parent_id" property="dirParentId" />
        <result column="dir_root_id" property="dirRootId" />
        <result column="dir_level" property="dirLevel" />
        <result column="dir_path" property="dirPath" />
        <result column="tenant_id" property="tenantId" />
        <result column="dir_current_id" property="dirCurrentId" />
        <!--id作为参数递归调用getDeptTree,查询子节点-->
        <collection property="mDirectoryMenu" column="{dirCurrentId = dir_current_id,tenantId = tenant_id}" ofType="map" select="findMenuMDirectory"/>
    </resultMap>

    <select id="findMDirectory"  resultMap="treeMap" >
        SELECT <include refid="Base_Column_List" />
        FROM  m_directory WHERE  dir_parent_id = 0 and tenant_id = #{tenantId}
    </select>
    <!-- 查询子节点 -->
    <select id="findMenuMDirectory" parameterType="java.util.Map" resultMap="treeMap" >
        SELECT <include refid="Base_Column_List" />
        FROM  m_directory WHERE dir_parent_id RegExp #{dirCurrentId} and tenant_id RegExp #{tenantId}
    </select>

java 8版本 树结构数据获取::

 //获取父节点
        List<SpuBaseClassificationMenuVo> collect = spuBaseClassificationVoList.stream().filter(m -> m.getParentId().equals("0")).map(
                (m) -> {
                    m.setChildList(getChildrens(m, spuBaseClassificationVoList));
                    return m;
                }
        ).collect(Collectors.toList());
 private List<SpuBaseClassificationMenuVo> getChildrens(SpuBaseClassificationMenuVo spuBaseClassificationMenuVo, List<SpuBaseClassificationMenuVo> spuBaseClassificationVoList) {

        List<SpuBaseClassificationMenuVo> children = spuBaseClassificationVoList.stream().filter(m -> {
            return Objects.equals(m.getParentId(), spuBaseClassificationMenuVo.getViewId());
        }).peek(
                (m) -> m.setChildList(getChildrens(m, spuBaseClassificationVoList))
        ).collect(Collectors.toList());
        return children;
    }

其他版本后续输出!!!

/** * 根据等级查询类目树 * * @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 dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值