java根据父类id生成Tree形数据(Stream()流方式处理),亲测简单好用
实体类不进行创建,只展示核心的代码!!!
主要分为以下几个步骤:
(1)先根据接口传入的对象查询出对应的数据
List<ProjectLeader> list = projectLeaderService.list(Condition.getLikeQueryWrapper(projectLeader));
(2)遍历当前查询出来的数据,找出所有顶级(规定父类id为0的数据,具体按自己的需求而定)
List<ProjectLeader> collect = list.stream()
.filter(o -> StrUtil.equals("0", o.getInviteTenders()))
(3)给当前父级childList设置子数据
.peek(o -> o.setChildList(getChildList(o, list)))
(4)拿到当前对象和查询出来的list集合进行递归,查到父类id没有子数据递归结束(根据当前父类 找出子类, 并通过递归找出子类的子类)
private List<ProjectLeader> getChildList(ProjectLeader projectLeader, List<ProjectLeader> list) {
return list.stream()
//筛选出父节点id == parentId 的所有对象 => list
.filter(o -> StrUtil.equals(String.valueOf(projectLeader.getId()), o.getInviteTenders()))
.peek(o -> o.setChildList(getChildList(o, list)))
.collect(Collectors.toList());
}
完整代码如下
public AjaxResult listWithTree(ProjectLeader projectLeader) {
// 1. 先查出所有数据
List<ProjectLeader> list = projectLeaderService.list(Condition.getLikeQueryWrapper(projectLeader));
List<ProjectLeader> collect = list.stream()
// 2. 找出所有顶级(规定 0 为顶级)
.filter(o -> StrUtil.equals("0", o.getInviteTenders()))
// 3.给当前父级的 childList 设置子
.peek(o -> o.setChildList(getChildList(o, list)))
// 4.收集
.collect(Collectors.toList());
return AjaxResult.success(collect);
}
// 根据当前父类 找出子类, 并通过递归找出子类的子类
private List<ProjectLeader> getChildList(ProjectLeader projectLeader, List<ProjectLeader> list) {
return list.stream()
//筛选出父节点id == parentId 的所有对象 => list
.filter(o -> StrUtil.equals(String.valueOf(projectLeader.getId()), o.getInviteTenders()))
.peek(o -> o.setChildList(getChildList(o, list)))
.collect(Collectors.toList());
}
创作不易,点个赞再走吧!!!