1.测试实体类
/**
* @author : zhang sq
* @date : 2022/7/30 9:54
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Recursion implements Serializable {
private int id;
/**
* 父id
*/
private int parentId;
/**
* 名称
*/
private String name;
/**
* 排序值
*/
private int sort;
/**
* 创建时间
*/
private Date createTime;
private List<Recursion> childern;
public Recursion(int id, int parentId, String name) {
this.id = id;
this.parentId = parentId;
this.name = name;
}
public Recursion(int id, int parentId, String name, int sort, Date createTime) {
this.id = id;
this.parentId = parentId;
this.name = name;
this.sort = sort;
this.createTime = createTime;
}
}
2.测试代码
/**
* @author : zhang sq
* @date : 2022/7/30 9:55
**/
public class Test {
public static void main(String[] args) {
//模拟测试数据
List<Recursion> recursionlist = new ArrayList<>();
Recursion re1 = new Recursion(1,0,"湖北省",1 ,new Date());
Recursion re2 = new Recursion(2,1,"孝感市",3 ,new Date());
Recursion re3 = new Recursion(3,2,"云梦县",2 ,new Date());
Recursion re4 = new Recursion(4,3,"义堂镇",2 ,new Date());
Recursion re5 = new Recursion(5,1,"武汉市",2 ,new Date());
Recursion re6 = new Recursion(6,5,"江夏区",2 ,new Date());
Recursion re7 = new Recursion(7,6,"佛祖岭",2 ,new Date());
recursionlist.add(re1);recursionlist.add(re2);
recursionlist.add(re3);recursionlist.add(re4);
recursionlist.add(re5);recursionlist.add(re6);
recursionlist.add(re7);
//根据最外层数据递归
re1.setChildern(Recursion(recursionlist, re1.getId()));
System.out.println(JSON.toJSONString(re1));
}
/**
* 递归 (常用于菜单 , 自关联的递归查询 )
* @param recursionlist 所有的自关联数据
* @param parentId 最外层的主键id
* @return tree 树结构
*/
private static List<Recursion> Recursion(List<Recursion> recursionlist, int parentId){
List<Recursion> recursionlist2 = new ArrayList<>();
Optional.ofNullable(recursionlist).orElse(new ArrayList<>())
.stream()
.filter(recursion -> recursion.getParentId()==parentId) //过滤 父id == 当前id的 ,(取当前下级)
.forEach(recursion -> { //遍历下级存 List
recursionlist2.add(
Recursion.builder()
.id(recursion.getId())
.name(recursion.getName())
.parentId(recursion.getParentId())
.sort(recursion.getSort())
.createTime(new Date())
.childern(Recursion(recursionlist,recursion.getId()))
.build());
});
//每次递归数据 进行排序处理
List<Recursion> collect = Optional.ofNullable(recursionlist2).orElse(new ArrayList<>())
.stream()
.sorted(Comparator.comparing(Recursion::getSort) //根据sort排序.sort必须有值,不然会空指针
.thenComparing(Recursion::getCreateTime))
.collect(Collectors.toList());
return collect;
}
}