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;
    }
相关推荐
MY_TEUCK1 天前
Sealos 平台部署实战指南:结合 Cursor 与版本发布流程
java·人工智能·学习·aigc
2401_873479401 天前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope1 天前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python1 天前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
朝新_1 天前
【Spring AI 】图像与语音模型实战
java·人工智能·spring
RH2312111 天前
2026.4.16Linux 管道
java·linux·服务器
zmsofts1 天前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis
浪浪小洋1 天前
c++ qt课设定制
开发语言·c++
charlie1145141911 天前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
故事和你911 天前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论