Java Streams API - 按多个字段分组

Posted

技术标签:

【中文标题】Java Streams API - 按多个字段分组【英文标题】:Java Streams API - Grouping by multiple fields 【发布时间】:2022-01-04 05:09:46 【问题描述】:

我有以下字段的 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

这个来自 db 的结果存储在以下数据结构中。

class ProductWithComments
    private String productName;
    private String productCode;
    private String price;
    private String productId;
    private String country;
    private String comment;
    private String languageCode;

现在,如您所见,带有 cmets 的产品有重复的产品。因为每个产品都有多种语言的cmet,使用Java Streams API,如何将上面的数据列表转换为List。

意思是,我按产品分组,每个产品都有很多评论。所以基本上分组需要使用许多列(productName , productCode, price, productId, country),然后一个组的所有评论都应该列在List&lt;Comments&gt;中。提前感谢您提供这方面的任何指南。

关于这个问题与***中其他问题类似的评论,这里是我的解释。我的问题是关于多个分组文件。您提供的 URL 按一个字段分组。使用一个字段完成分组时,很简单

【问题讨论】:

您希望能够使用其中一个字段进行查找,还是一次只使用所有五个字段? @LouisWasserman 来自数据库,当我获取数据时,我会得到产品的重复项。因此,我正在寻找一种对副产品进行分组的方法,以便一个产品具有多个 cmets。我不会进行任何查找。我已根据我的要求更新了问题。 这能回答你的问题吗? Group by multiple field names in java 8 @AlexRudenko,我在提出这个问题之前看过这个。我的问题是关于多个分组文件。您提供的 URL 按一个字段分组。当使用一个字段完成分组时,它很简单 我提供的 URL 专门处理按问题标题所述的多个字段进行分组。并且 OP 有一个问题:就我而言,我想按姓名和年龄分组。 【参考方案1】:

你需要拉出一个类作为key使用:

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())));

【讨论】:

以上是关于Java Streams API - 按多个字段分组的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

hive表按多个字段分桶怎么理解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解