SpringBoot -> Stream流实现
步骤:先查询所有级联的数据,然后通过Java8 Stream 流 来比较和判断,最终生成有顺序的级联数据
实体类:
@Data
public class Addr {
/**
* 主键id
*/
private Long addrId;
/**
* 名称
*/
private String addrName;
/**
* 子id
*/
private Integer addrPid;
private List<Addr> children;
}
对应的sql语句:
select addr_id,addr_name,addr_pid from addr
业务层:
使用递归的方法来进行多级查询
public List<Addr> findAll() {
//根据数据库查询所有地址的数据
List<Addr> mapperAll = addrMapper.findAll();
//使用Steam API过滤出一级地址(pid为0的地址) 并设置子地址
List<Addr> collect = mapperAll.stream().filter(addr -> addr.getAddrPid() == 0)//过滤pid为0的一级地址
.map(addr -> {
//为每个一级地址设置相应的子地址
addr.setChildren(getChildren(addr.getAddrId(), mapperAll));
return addr;
}).collect(Collectors.toList());//收集处理后的地址列表
return collect; //返回构建好的地址树
}
/**
* 递归查询并返回给定父id下的所有的子地址
* @param pid
* @param addrs
* @return
*/
private List<Addr> getChildren(Long pid,List<Addr> addrs){
//使用Stream API过滤出所有父id为pid的地址
List<Addr> collect = addrs.stream()
.filter(addr -> addr.getAddrPid().intValue()==pid.intValue()) // 注意这里使用了equals来比较Integer
.map(addr -> {
//递归地为每个子地址设置相应的子地址
addr.setChildren(getChildren(addr.getAddrId(), addrs));
return addr;
}).collect(Collectors.toList());//收集处理后的地址列表
return collect.size() == 0 ? null: collect ; //返回构建好的地址树
}
标签:Stream,return,SpringBoot,递归,List,pid,collect,地址,addr
From: https://blog.csdn.net/X_xxxx7/article/details/142569839