java stream 使用Collectors.groupingBy进行分组统计数量
时间: 2025-01-04 14:30:44 浏览: 6
在Java Stream API中,`Collectors.groupingBy()`是一个非常有用的函数式操作,用于按照指定键对元素进行分组,并计算每个组的数量或统计其他值。它的基本语法如下:
```java
List<T> elements = ...; // 原始列表
Map<Key, Group> result = elements.stream()
.collect(Collectors.groupingBy(keyExtractor, counting()));
```
这里:
- `elements` 是你要处理的集合;
- `keyExtractor` 是一个函数,用于从每个元素中提取用于分组的关键值(Key);
- `counting()` 是一个收集者,它会返回一个 `Map<Key, Long>`,其中键是分组的关键值,值是对每个键对应的元素数量。
例如,如果你有一个学生的列表,你可以按年级分组并统计各年级的学生数:
```java
List<Student> students = ...;
Map<Integer, Long> gradesWithCounts = students.stream()
.collect(Collectors.groupingBy(Student::getGrade, Collectors.counting()));
```
这将返回一个 `Map`,如 `{1: 5, 2: 7}`,表示一年级有5名学生,二年级有7名学生。
相关问题
Easypoi导出list.stream().collect(Collectors.groupingBy(),Collectors.summingInt())分组统计后的数据
根据提供的引用内容,Easypoi是一个Java的Excel导入导出工具,可以方便地将Java对象导出为Excel文件。在使用Easypoi导出list.stream().collect(Collectors.groupingBy(),Collectors.summingInt())分组统计后的数据时,可以按照以下步骤进行操作:
1.首先,需要将数据按照指定的字段进行分组,可以使用Collectors.groupingBy()方法实现。例如,按照学生的班级进行分组:
```java
Map<String, List<Student>> map = studentList.stream().collect(Collectors.groupingBy(Student::getClassName));
```
2.然后,需要对每个分组进行统计,可以使用Collectors.summingInt()方法实现。例如,统计每个班级的学生人数:
```java
Map<String, Integer> countMap = studentList.stream().collect(Collectors.groupingBy(Student::getClassName, Collectors.summingInt(e -> 1)));
```
3.最后,将分组和统计的结果合并到一个对象中,可以使用Easypoi的ExcelExportUtil.exportExcel()方法实现。例如,将每个班级的学生人数导出到Excel文件中:
```java
List<ExcelExportEntity> entityList = new ArrayList<>();
entityList.add(new ExcelExportEntity("班级", "className"));
entityList.add(new ExcelExportEntity("人数", "count"));
List<Map<String, Object>> dataList = new ArrayList<>();
for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
Map<String, Object> map = new HashMap<>();
map.put("className", entry.getKey());
map.put("count", entry.getValue());
dataList.add(map);
}
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), entityList, dataList);
```
.stream().collect(Collectors.groupingBy
引用中提到,对于分组操作,可以使用Stream的collect()方法和Collectors的groupingBy()方法进行处理。引用和引用是两个Java代码示例,展示了如何使用Java 8的Stream和Collectors来进行分组操作。
具体来说,.stream().collect(Collectors.groupingBy()的作用是将集合中的元素按照指定的条件进行分组,并返回一个Map对象,其中键是分组的条件,值是分组后的元素数量。
引用中的示例展示了如何将一个字符串列表按照元素进行分组,并统计每个元素出现的次数。代码中使用了Function.identity()作为分组条件,即按照元素本身进行分组。最后将分组结果打印出来。
引用中的示例在引用的基础上,增加了对分组结果的排序。代码首先使用sorted()方法对分组结果进行排序,排序规则是按照值的大小进行降序排序。然后使用forEachOrdered()方法将排序后的结果添加到一个LinkedHashMap中,最后将排序后的分组结果打印出来。
综上所述,stream().collect(Collectors.groupingBy()的作用是将集合中的元素按照指定的条件进行分组,并返回一个Map对象。可以根据需要对分组结果进行进一步处理,例如统计数量或排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Java stream多字段分组(groupingBy)](https://blog.csdn.net/m0_58016522/article/details/131082125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [Stream Collectors groupingBy 使用实例](https://blog.csdn.net/gerald2008/article/details/106589244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文