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;
    }
相关推荐
程序员的世界你不懂7 分钟前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年8 分钟前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
lingchen190633 分钟前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
gb42152871 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go1 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
曾经的三心草1 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
蒋星熠1 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
Metaphor6921 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea1 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha1 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统