树形结构查询

本文介绍了一种在数据量较小的情况下,如何利用Java的Stream流和递归方法来构建树形结构。首先,从数据库获取所有CourseCategory实体类的数据,接着筛选出根节点(pid为0)和非根节点。然后,通过遍历根节点并使用递归方法busorts将子节点挂载到对应的父节点上,最终形成树形结构。这种方法简化了数据组织的复杂性。
摘要由CSDN通过智能技术生成

      利用Stream流和递归实现树形结构

 数据库

 实体类

@Data
@AllArgsConstructor
@NoArgsConstructor // 这个一定要覆盖
@Builder
@TableName("kss_course_category")
public class CourseCategory {

    @TableId(type = IdType.AUTO)
    private Integer id;
    // 上课标题
    private String title;
    // 分类描述
    private String description;
    // 是否更新
    private Integer mark;
    // 发布状态1发布 0未发布
    private Integer status;
    // 类型 1文件夹 2文件
    private Integer type;
    // 父id =0 根集 其它全部都是子集
    private Integer pid;
    // 是否展开和收起
    private Boolean isexpand;
    // 这里一定加exist=false ,代表当前这个字段不在表中,不加就会报错  这个就是存储子集用的
    @TableField(exist = false)
    private List<CourseCategory> chilrenList;
    // 创建时间
    @TableField(fill = FieldFill.INSERT)//在新增的时候填充
    private Date createTime;
    // 更新时间
    @TableField(fill = FieldFill.INSERT_UPDATE)//在新增的时候填充
    private Date updateTime;
}

当数据量很少的时候可以用这个方法来做

   public List<CourseCategory> findCategoriesTree() {
        //1.查询表中所有的数据
        List<CourseCategory> allList = this.list();
        //2.找到所有根节点 pid=0
        List<CourseCategory> rooList = allList.stream().filter(courseCategory -> courseCategory.getPid().equals(0)).collect(Collectors.toList());
        //3.找到所有非根节点
        List<CourseCategory> subList = allList.stream().filter(courseCategory -> !courseCategory.getPid().equals(0)).collect(Collectors.toList());
        //4.循环阶段去subList找对应的字节点
//        rooList = rooList.stream().map(root -> {
//            //通过根节点的id和子节点的pid判断是否相等,如果相等的话,代表是根节点的子集
//            List<CourseCategory> childrenList = subList.stream().filter(courseCategory -> courseCategory.getPid().equals(root.getId())).collect(Collectors.toList());
//            //如果当前没一个子级,初始化一个数组
//            if (CollectionUtils.isEmpty(childrenList)){
//                childrenList =new ArrayList<>();
//            }
//            root.setChilrenList(childrenList);
//            return root;
//        }).collect(Collectors.toList());

        //简化成下面
        rooList.forEach(root->busorts(root,subList));
        return rooList;
    }


//这个看不懂可以先看注释部分

 public void  busorts(CourseCategory root,List<CourseCategory> subList){
        List<CourseCategory> childrenList = subList.stream().filter(courseCategory -> courseCategory.getPid().equals(root.getId())).collect(Collectors.toList());
        if (!CollectionUtils.isEmpty(childrenList)){
            root.setChilrenList(childrenList);
            childrenList.forEach(child->busorts(child,subList));
        }else {
            root.setChilrenList(new ArrayList<>());
        }
    }

参考:【学相伴飞哥】Java新特性-stream流初步学习_哔哩哔哩_bilibili

/** * 根据等级查询类目树 * * @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; }
在Spring Boot中实现树形结构查询需要以下步骤: 1. 定义树形结构实体类,包含节点ID、父节点ID、节点名称等属性。 2. 使用JPA或MyBatis等持久化框架,将树形结构实体类映射到数据库表中。 3. 编写树形结构查询方法,可以使用递归方式或者使用SQL语句实现。 4. 在Controller层中接收请求,调用树形结构查询方法,返回结果。 下面是一个使用JPA实现树形结构查询的示例代码: ``` @Entity @Table(name = "tree_node") public class TreeNode { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "parent_id") private Long parentId; @Column(name = "name") private String name; // 省略getter和setter方法 } @Service public class TreeService { @Autowired private TreeNodeRepository treeNodeRepository; public List<TreeNode> getTree() { List<TreeNode> rootNodes = treeNodeRepository.findByParentIdIsNull(); for (TreeNode rootNode : rootNodes) { buildTree(rootNode); } return rootNodes; } private void buildTree(TreeNode parentNode) { List<TreeNode> childNodes = treeNodeRepository.findByParentId(parentNode.getId()); if (!childNodes.isEmpty()) { parentNode.setChildren(childNodes); for (TreeNode childNode : childNodes) { buildTree(childNode); } } } } @RestController @RequestMapping("/tree") public class TreeController { @Autowired private TreeService treeService; @GetMapping public List<TreeNode> getTree() { return treeService.getTree(); } } ``` 在上面的示例代码中,TreeNode为树形结构实体类,TreeService中的getTree()方法使用递归方式构建树形结构,TreeController中的getTree()方法返回树形结构数据。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值