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
相关产品推荐
相关产品推荐

