Collectors.groupingBy(Student::getName)
时间: 2024-06-04 13:05:24 浏览: 108
这是Java 8中的Stream API,用于对Student对象列表进行分组,按照Student的名称进行分组。这里的Student::getName是Java 8中的方法引用,它指定了按照Student的名称进行分组。
具体用法如下所示:
```java
Map<String, List<Student>> studentsByName = students.stream()
.collect(Collectors.groupingBy(Student::getName));
```
这将会根据每个Student的名称对Student对象列表进行分组,最终返回一个Map对象,其中包含了按名称分组后的Student列表。
相关问题
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 分组后对list实体类转换
如果你想使用`Collectors.groupingBy`对一个list进行分组,并将每个分组的元素转换为另一个实体类,你可以使用`Collectors.mapping`来实现。下面是一个示例,假设我们有一个Person类和一个Student类,我们要按照年龄(age)对Person列表进行分组,并将每个分组的Person对象转换为Student对象:
```java
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// getters and setters
}
class Student {
private String name;
private int age;
private String grade;
public Student(String name, int age, String grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
// getters and setters
}
public class Main {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice", 20));
persons.add(new Person("Bob", 22));
persons.add(new Person("Charlie", 20));
persons.add(new Person("David", 22));
Map<Integer, List<Student>> groupedStudents = persons.stream()
.collect(Collectors.groupingBy(Person::getAge,
Collectors.mapping(person -> new Student(person.getName(), person.getAge(), "A+"),
Collectors.toList())));
System.out.println(groupedStudents);
}
}
```
在上述示例中,我们通过`Collectors.groupingBy`按照年龄将Person列表分组。在`Collectors.mapping`中,我们将每个Person对象转换为一个Student对象,并使用`Collectors.toList`将它们收集到一个列表中。最终,我们得到了一个以年龄为键,以Student列表为值的Map。
请注意,上述示例中的Person和Student类仅作为示例,你可以根据自己的实际需求定义和修改这两个类。
阅读全文