Java Stream 根据字段去重聚合实现方法
简介
在Java开发中,我们经常需要对数据进行去重和聚合操作。使用Java Stream可以简洁高效地实现这些操作。本文将详细介绍如何使用Java Stream根据字段去重聚合,并提供代码示例和注释说明。
流程图
journey
title Java Stream 根据字段去重聚合实现方法
section 准备工作
清洗数据
根据字段进行去重
section 聚合操作
根据字段进行聚合
返回结果
步骤说明
以下是根据字段去重聚合的步骤:
步骤 | 描述 |
---|---|
1 | 清洗数据 |
2 | 根据字段进行去重 |
3 | 根据字段进行聚合 |
4 | 返回结果 |
代码实现
1. 清洗数据
在开始进行去重聚合操作之前,我们首先需要准备一些数据。假设我们有一个包含了学生姓名和年龄的列表,现在我们需要对学生姓名进行去重聚合。
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", 18));
students.add(new Student("Bob", 20));
students.add(new Student("Alice", 19));
students.add(new Student("Charlie", 21));
students.add(new Student("Bob", 22));
2. 根据字段进行去重
我们可以使用Java Stream的distinct()方法对列表中的学生姓名进行去重。distinct()方法可以根据对象的equals()方法进行去重操作。
List<Student> distinctStudents = students.stream()
.distinct()
.collect(Collectors.toList());
3. 根据字段进行聚合
我们可以使用Java Stream的collect()方法对列表中的学生姓名进行聚合操作。在聚合操作之前,我们需要先定义一个自定义的Collector来进行聚合。
Map<String, List<Student>> groupedStudents = students.stream()
.collect(Collectors.groupingBy(Student::getName));
4. 返回结果
最后,我们可以将去重和聚合的结果输出。
System.out.println("去重结果:");
distinctStudents.forEach(System.out::println);
System.out.println("聚合结果:");
groupedStudents.forEach((name, students) -> System.out.println(name + ": " + students));
完整代码
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Student student = (Student) obj;
return age == student.age && name.equals(student.name);
}
@Override
public int hashCode() {
return 31 * name.hashCode() + age;
}
@Override
public String toString() {
return name + ": " + age;
}
}
public class Main {
public static void main(String[] args) {
// 准备数据
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", 18));
students.add(new Student("Bob", 20));
students.add(new Student("Alice", 19));
students.add(new Student("Charlie", 21));
students.add(new Student("Bob", 22));
// 去重操作
List<Student> distinctStudents = students.stream()
.distinct()
.collect(Collectors.toList());
// 聚合操作
Map<String, List<Student>> groupedStudents = students.stream()
.collect(Collectors.groupingBy(Student::getName));
// 输出结果
System.out.println("去重结果:");
distinctStudents.forEach(System.out::println);
System.out.println("聚合结果:");
groupedStudents.forEach((name, students) -> System.out.println(name + ": " + students));
}
}
结果
运行以上代码,将得到以下结果:
去重结果:
Alice: 18
Bob: 20
Charlie: 21
Bob: 22
聚合结果:
Alice: [Alice: 18, Alice: 19]
Bob: [Bob: 20