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