java—stream流递归实现树形结构

JavaSE基础 专栏收录该内容
22 篇文章 0 订阅

一、在项目开发中,经常会遇到像菜单式的页面,如下图
在这里插入图片描述
数据表结构一般像一个树形结构一样
在这里插入图片描述
对应的Model体

@Data //代替get、set方法
@ApiModel("知识园地视图")
public class ContentKnowledgeVO{

    /***
     * 主键id
     */
    @ApiModelProperty("主键id")
    private String knowledgeId;

    /***
     *类型名称
     */
    @ApiModelProperty("类型名称")
    private String knowledgeName;

    /***
     * 上级id
     */
    @ApiModelProperty("上级id")
    private String parentCode;

    /***
     * 类型内容
     */
    @ApiModelProperty("类型内容")
    private String knowledgeContext;

    /**
     * 默认显示状态为0
     * 0是显示,1是不显示
     */
    @ApiModelProperty("显示状态")
    private Integer enabledState;

    /***
     * 实现递归的条件
     */
    @ApiModelProperty("子节点列表")
    private List<ContentKnowledgeVO> childContentList;
}

二、Stream流实现递归结构代码

    @Override
    public List<ContentKnowledgeVO> getContentKnowledgeList() {
        //从数据库中查询出所有数据
        List<ContentKnowledgeVO> contentKnowledgeList = contentKnowledgeMapper.getContentKnowledgeList();

        //获取父节点,0表示父节点
        List<ContentKnowledgeVO> collect = contentKnowledgeList.stream().filter(e -> e.getParentCode().equals("0")).map(e -> {
            e.setChildContentList(getChildrens(e, contentKnowledgeList));
            return e;
        }).collect(Collectors.toList());
        return collect;
    }


    /**
     * 递归查询子节点
     * @param root
     * @param contentKnowledgeList
     * @return
     */
    private List<ContentKnowledgeVO> getChildrens(ContentKnowledgeVO root, List<ContentKnowledgeVO> contentKnowledgeList) {
        List<ContentKnowledgeVO> childrenList = contentKnowledgeList.stream().filter(e -> Objects.equals(e.getParentCode(), root.getKnowledgeId())).map(
                e -> {
                    e.setChildContentList(getChildrens(e, contentKnowledgeList));
                    return e;
                }
        ).collect(Collectors.toList());
        return childrenList;
    }

注意:适用情况一般在一个数据表中,父节点与子节点内容一样
参考博客

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

相关推荐
/** * 根据等级查询类目树 * * @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 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值