You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 8如何将扁平对象列表转换为嵌套对象列表?

用Java 8实现扁平对象到分层对象的转换

要完成从List<MyFlatObject>到List<Category>的转换,核心是利用Java 8 Stream的分组功能,先按分类聚合数据,再按产品聚合特征,最后组装成目标对象结构。

完整实现代码

假设你的实体类已提供对应的Getter方法,且Category、Product类有接收对应参数的构造函数,代码如下:

// 你的原始扁平对象列表
List<MyFlatObject> flatObjects = ...;

List<Category> result = flatObjects.stream()
    // 第一步:按category分组,得到每个分类下的所有扁平数据
    .collect(Collectors.groupingBy(MyFlatObject::getCategory))
    .entrySet()
    .stream()
    .map(categoryEntry -> {
        String categoryName = categoryEntry.getKey();
        List<MyFlatObject> categoryItems = categoryEntry.getValue();
        
        // 第二步:在当前分类下,按productId分组并收集对应的features
        Map<String, List<String>> productFeatures = categoryItems.stream()
            .collect(Collectors.groupingBy(
                MyFlatObject::getProductId,
                Collectors.mapping(MyFlatObject::getFeature, Collectors.toList())
            ));
        
        // 第三步:将产品-特征映射转换为Product列表
        List<Product> products = productFeatures.entrySet()
            .stream()
            .map(productEntry -> new Product(productEntry.getKey(), productEntry.getValue()))
            .collect(Collectors.toList());
        
        // 第四步:组装Category对象
        return new Category(categoryName, products);
    })
    .collect(Collectors.toList());

关键说明

  • 如果你的实体类没有现成的构造函数,可以改用Setter方法赋值,例如:
    // 替换Product的构造方式
    Product product = new Product();
    product.setProductId(productEntry.getKey());
    product.setFeatures(productEntry.getValue());
    
  • 转换逻辑会自动去重分类和产品:原始列表中同一分类的多条数据会合并为一个Category对象,同一产品的多个特征会合并到Product的features列表中,完全符合你提出的"12个对象转3个Category"的需求。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:55:06