Collectors.groupingBy() 多字段分组,如何处理
时间: 2023-10-26 19:41:51 浏览: 38
在使用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 多字段分组求和
在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的和。
stream Collectors.groupingBy多个字段分组
stream Collectors.groupingBy多个字段分组是一种Java 8中的流式编程技术,它可以将一个集合按照多个字段进行分组。在这个过程中,我们可以使用Collectors.groupingBy方法来实现多个字段的分组。具体来说,我们可以使用lambda表达式或方法引用来指定分组的字段,然后使用Collectors.groupingBy方法将集合按照这些字段进行分组。例如,我们可以使用以下代码将一个User对象集合按照年龄和性别进行分组:
List<User> userList = new ArrayList<>();
Map<String, List<User>> ageGroupMap = userList.stream().collect(Collectors.groupingBy(x -> x.getAge() + "#" + x.getSex()));
在这个例子中,我们使用lambda表达式指定了分组的字段,即年龄和性别。然后,我们使用Collectors.groupingBy方法将集合按照这些字段进行分组,并将结果存储在一个Map对象中。最终,我们可以通过Map对象来访问分组后的数据。