基于SpringBoot 应用Stream流+递归 实现多级分类

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 ; //返回构建好的地址树
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值