java递归构建树形列表
前端需要在页面展示一棵完整的目录树,在这里记录一下demo
后端部门实体类
@Data
@NoArgsConstructor
@TableName("sys_dept")
public class SysDeptDo {
private int deptId;
private String deptName;
private int parentId;
@TableField(exist = false)
private List<SysDeptDo> children;
}
构建部门目录树代码
@Service("sysDeptServiceImpl")
public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDeptDo> implements SysDeptService{
@Autowired
SysDeptMapper sysDeptMapper;
@Override
public List<SysDeptDo> getTree() {
// 查询所有dept
List<SysDeptDo> sysDeptDos = sysDeptMapper.selectList(null);
// 根节点数量
Integer num = sysDeptMapper.selectCount(new LambdaQueryWrapper<SysDeptDo>().isNull(SysDeptDo::getParentId));
return buildTree(sysDeptDos,num);
}
public List<SysDeptDo> buildTree(List<SysDeptDo> sysDeptDos,Integer num){
List<SysDeptDo> list = new ArrayList<>();
List<SysDeptDo> tempList = new ArrayList<>();
// 重复装入已经装载过子级的集合
tempList.addAll(sysDeptDos);
Iterator<SysDeptDo> iterator = sysDeptDos.iterator();
while (iterator.hasNext()){
SysDeptDo next = iterator.next();
// 遍历集合如果parentId=当前对象id,则装入其childrenList
List<SysDeptDo> childrenList = sysDeptDos.stream().filter(sysDeptDo -> {
if (next.getDeptId() == sysDeptDo.getParentId()) {
// 将已经被装载过的对象从集合中剔除
tempList.remove(sysDeptDo);
return true;
} else {
return false;
}
}).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(childrenList)){
next.setChildren(childrenList);
list.add(next);
}
}
// 判断当前集合长度是否等于根节点数量
while (!(tempList.size() ==num)){
// 递归装载子级
buildTree(list,num);
}
return tempList;
}
}
传递给前端的结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下