使用 Java Stream API 按多个字段进行分组

问题描述 投票:0回答:1

我有一个包含以下字段的 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 中的其他问题类似,但我的问题是关于多个分组字段的。其他问题仅按一个字段分组。当使用一个字段完成分组时,这很简单。

java java-8 java-stream
1个回答
4
投票

你需要拉出一个类来用作密钥:

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())));
© www.soinside.com 2019 - 2024. All rights reserved.