Java 处理Mysql获取树形的数据

Mysql数据:

代码如下:

Entity:

复制代码
@Data
@Accessors(chain = true)
public class Region {
    private BigInteger id;
    //名称
    private String name;
    //父id
    private BigInteger parentId;
    private List<Region> children;
    private Integer createTime;
    private Integer updateTime;
    private Integer isDeleted;
}

Service核心代码:

复制代码
List<Region> reginaList = regionMapper.findReginaList();

        //将数据以父类ID分组成map:{1:[xxx,xxx],2:[xxx,xxxx]}
        Map<BigInteger, List<Region>> parentIdMap = reginaList.stream().collect(Collectors.groupingBy(Region::getParentId, Collectors.toList()));

        //循环每个数据,从父类MAP中通过他的ID获取他的子类塞到children中
        reginaList.forEach(region -> addChildren(region, parentIdMap));

        //只筛选出最顶级数据
        List<Region> regions =
                reginaList.stream().filter(regina -> regina.getParentId().compareTo(BigInteger.ZERO) == 0).collect(Collectors.toList());


 private void addChildren(Region region, Map<BigInteger, List<Region>> parentIdMap) {
        List<Region> regions = parentIdMap.get(region.getId());
        if (regions != null) {
            region.setChildren(regions);
            regions.forEach(child -> addChildren(child, parentIdMap)); // 递归添加子级的子级
        }
    }

第二种写法:

复制代码
        reginaList.stream().filter(city-> city.getParentId().compareTo(BigInteger.ZERO) == 0).peek(city -> city.setCityNames(getChildren(city,reginaList)))
  .collect(Collectors.toList());


    public List<Region> getChildren(Region region, List<Region> regionList) {
        List<Region> childrens = regionList.stream().filter(re -> re.getParentId().compareTo(region.getId()) == 0)
                .map(childRegion -> {
                    childRegion.setAddressNames(getChildren(childRegion, regionList));
                    return childRegion;
                }).collect(Collectors.toList());
        return childrens;
    }
相关推荐
Memory_荒年几秒前
马年驯服不稳定服务:Resilience4j 容错救星驾到!
java·后端
卓怡学长几秒前
m278基于web的在线教学质量评价系统
java·数据库·spring·tomcat·maven·intellij-idea
程序员buddha1 分钟前
Java面试八股文Redis篇
java·redis·面试
楼田莉子2 分钟前
高并发内存池项目:内存池性能分析及其优化
开发语言·c++·后端·学习
rannn_1114 分钟前
【Redis|实战篇4】黑马点评|分布式锁
java·数据库·redis·分布式·后端
wapicn996 分钟前
智能识别技术在生活服务领域的落地应用与前景展望
java·c++·人工智能·python·php
是翔仔呐9 分钟前
第6章 UART串口通信!掌握单片机与外界的双向数据通道,实现跨设备交互
c语言·开发语言·单片机·嵌入式硬件·gitee
带娃的IT创业者10 分钟前
从本地开发到 PyPI发布:WeClaw 的 Python 包标准化之旅
开发语言·python
2201_7586426411 分钟前
自定义内存检测工具
开发语言·c++·算法
吠品15 分钟前
QEMU Windows虚拟机NAT网络配置指南:实现IP自动获取与外部访问
开发语言·php