我有一个包含以下字段的 Java POJO:
class Product{
private String productName;
private String productCode;
private String price;
private String productId;
private String country;
private List<Comments> comments;
}
class Comments {
private String productCode;
private String languageCode;
private String comment;
}
当我从数据库检索数据时,我得到以下格式的数据:
productName, productCode, price, productId, country, languageCode , comment
iPhone , 1XBA22 , 1000 , 134 , USA , EN , comment in English
iPhone , 1XBA22 , 1000 , 134 , USA , CN , comment in Chinese
laptop , 1234 , 2000 , 145 , UK , EN , comment in English
laptop , 1234 , 2000 , 145 , UK , CN , comment in Chinese
laptop , 1234 , 2000 , 145 , UK , FR , comment in French
数据库的结果存储在以下数据结构中:
class ProductWithComments{
private String productName;
private String productCode;
private String price;
private String productId;
private String country;
private String comment;
private String languageCode;
}
可以看到,有评论的产品有重复的产品,因为每个产品都有多种语言的评论。
使用 Java Streams API,如何将上面的数据列表转换为
List<ProductWithComments>
到 List<Product>
。
意思是,我按产品分组,每个产品都有很多评论。因此,基本上需要使用许多列进行分组
(productName , productCode, price, productId, country)
,然后一组的所有评论都应在List<Comments>
中列出。
这个问题与 Stack Overflow 中的其他问题类似,但我的问题是关于多个分组字段的。其他问题仅按一个字段分组。当使用一个字段完成分组时,这很简单。
你需要拉出一个类来用作密钥:
class ProductKey {
private String productName;
private String productCode;
private String price;
private String productId;
private String country;
private String languageCode;
// constructor, equals, hashCode, etc.
// leave out the fields we're not grouping by
}
那么你只需要做:
products.stream().collect(
Collectors.groupingBy(
product -> new ProductKey(product.getProductName(), ...),
Collectors.mapping(Product::getComment, Collectors.toList())));