利用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<>());
}
}