collectors.groupingby多字段分组
时间: 2024-09-13 21:03:50 浏览: 39
`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的和。
collectors.groupingby多字段
`Collectors.groupingBy()`是Java Stream API中的一个实用工具方法,用于对数据进行分组处理,通常基于一个或多个键进行分类。当你有一个集合,想要按照两个或更多的属性值来组织元素时,可以使用这个方法。
例如,假设你有一个Person对象列表,每个Person都有name和age属性。你可以这样做:
```java
List<Person> people = ...; // 假设Person是一个类,有name和age属性
Map<tuple<String, Integer>, List<Person>> groupedPeople =
people.stream()
.collect(Collectors.groupingBy(Person::getNameAndAge)); // 使用方法引用,这里假定getNameAndAge是返回一个元组(name, age)的方法
// 现在groupedPeople是一个Map,key是元组形式的(name, age),value是具有相同(name, age)的所有Person对象组成的列表
```
在这里,`Person::getNameAndAge`是一个方法引用来获取每个Person对象的键值,通常是通过组合两个字段(如姓名和年龄)得到的。
阅读全文