Collectors.groupingBy() 多字段分组,如何处理
时间: 2023-10-26 18:41:51 浏览: 174
在使用Collectors.groupingBy() 进行多字段分组时,需要使用到java.util.stream.Collectors类中的静态方法groupingBy()和toMap()。其中groupingBy()方法接收一个Function类型的参数,表示要分组的字段,然后返回一个Map类型的结果。toMap()方法则接收两个Function类型的参数,并将Map类型的结果转换为另一种Map类型,其中第一个参数表示键的来源,第二个参数表示值的来源。在多字段分组时,可以使用toMap()方法将分组结果映射为一个包含多个键值对的Map,每个键值对表示分组的结果。具体示例如下:
Map<String, Map<String, List<Order>>> result = orders.stream()
.collect(Collectors.groupingBy(Order::getRegion,
Collectors.groupingBy(Order::getCategory)));
上述示例代码对订单列表orders进行多字段分组,首先按照地区region进行一级分组,然后在每个地区下按照类别category进行二级分组,最终返回一个Map类型的结果,包含每个地区下各个类别的订单列表。
相关问题
collectors.groupingby多字段分组
`Collectors.groupingBy` 是 Java Stream API 中的一个重要工具,它用于对集合数据进行基于指定键的分组。这个方法允许你在一组对象上应用一个函数,然后根据该函数的结果值将它们分到不同的组里。它的基本语法通常是这样的:
```java
Map<Function<T, K>, List<T>> grouped = list.stream()
.collect(Collectors.groupingBy(keyExtractor));
```
这里,`T` 表示输入流中的元素类型,`K` 是映射键的类型,`keyExtractor` 是一个函数,用于从每个元素提取分组的依据(键)。这会返回一个 `Map<K, List<T>>` 结果,其中键是分组的依据,对应的值是一个包含属于该组的所有元素的列表。
例如,如果你有一个学生列表,你可以按照年级和班级对学生进行分组:
```java
List<Student> students = ...;
Map<String, Map<Integer, List<Student>>> groupedStudents = students.stream()
.collect(Collectors.groupingBy(Student::getGrade,
Collectors.groupingBy(Student::getClassroom)));
```
Collectors.groupingBy 多字段分组求和
在Java8中,可以使用Collectors.groupingBy方法实现集合的分组,类似于Mysql的group by分组功能。同时,可以使用多个字段进行分组,并对分组后的结果进行求和操作。以下是一个示例代码:
假设有一个Student类,包含name、age和score三个属性,现在需要按照name和age两个字段进行分组,并对每个分组的score进行求和操作。
```java
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 18, 80));
students.add(new Student("Tom", 18, 90)); students.add(new Student("Tom", 20, 85));
students.add(new Student("Jerry", 18, 75));
students.add(new Student("Jerry", 20, 95));
Map<String, Map<Integer, Integer>> result = students.stream()
.collect(Collectors.groupingBy(Student::getName,
Collectors.groupingBy(Student::getAge,
Collectors.summingInt(Student::getScore))));
System.out.println(result); }
}
class Student {
private String name;
private int age;
private int score;
public Student(String name, int age, int score) {
this.name = name;
this.age = age;
this.score = score;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getScore() {
return score;
}
}
```
输出结果为:
```
{Tom={18=170, 20=85}, Jerry={18=75, 20=95}}
```
可以看到,结果是一个嵌套的Map,第一层的key是name,第二层的key是age,value是score的和。
阅读全文