使用 Java Stream 根据对象分组的教程

在现代 Java 编程中,Stream API 提供了一种强大的方式来处理集合数据。通过流,我们可以执行各种操作,比如过滤、排序和聚合等。本文将引导您学习如何使用 Java Stream 根据对象进行分组。我们将逐步进行,确保您清楚每个步骤。

整体流程

下面是实现这一任务的整体流程:

步骤 描述
1 创建一个包含待分组对象的类。
2 创建一组对象并填充数据。
3 使用 Java Stream 对对象进行分组。
4 输出分组结果。

步骤详解

步骤 1:创建一个包含待分组对象的类

首先,我们需要定义一个类,以便我们能够根据某些字段对其对象进行分组。我们以一个简单的 Person 类为例,每个 Person 对象都具有 name(姓名)和 age(年龄)属性。

public class Person {
    private String name; // 姓名
    private int age;     // 年龄
    
    // 构造函数
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 获取姓名
    public String getName() {
        return name;
    }

    // 获取年龄
    public int getAge() {
        return age;
    }

    // 重写 toString() 方法,方便输出
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

步骤 2:创建一组对象并填充数据

接下来,我们将创建一个 List<Person> 并填充一些 Person 对象。我们可以在 main 方法中实现这一点。

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        // 创建一个存放 Person 对象的列表
        List<Person> people = new ArrayList<>();
        
        // 添加一些 Person 对象
        people.add(new Person("Alice", 25));
        people.add(new Person("Bob", 30));
        people.add(new Person("Charlie", 25));
        people.add(new Person("David", 30));
        people.add(new Person("Eve", 35));
        
        // 后续步骤将在此进行
    }
}

步骤 3:使用 Java Stream 对对象进行分组

现在我们可以使用 Collectors.groupingBy() 方法来根据年龄对人进行分组。这段代码实现了这一点。

import java.util.Map;
import java.util.stream.Collectors;

// 继续在 Main 类中,主方法之后
Map<Integer, List<Person>> groupedByAge = people.stream() // 将人列表转换为流
        .collect(Collectors.groupingBy(Person::getAge)); // 根据年龄进行分组

// 打印分组结果
groupedByAge.forEach((age, persons) -> {
    System.out.println("Age: " + age + " -> " + persons);
});

在这段代码中:

  • 我们使用 people.stream()List<Person> 转换为流。
  • Collectors.groupingBy(Person::getAge) 将流中的 Person 对象按照其年龄属性分组。返回的 Map 对象以年龄为键,对应的 List<Person> 为值。
  • 最后,我们遍历这个 Map 并打印分组结果。

步骤 4:输出分组结果

最终的打印结果会显示每个年龄及其对应的人员列表,像这样:

Age: 25 -> [Person{name='Alice', age=25}, Person{name='Charlie', age=25}]
Age: 30 -> [Person{name='Bob', age=30}, Person{name='David', age=30}]
Age: 35 -> [Person{name='Eve', age=35}]

类图

以下是 Person 类的简单类图,帮助您直观理解其结构。

classDiagram
    class Person {
        - String name
        - int age
        + Person(String name, int age)
        + String getName()
        + int getAge()
        + String toString()
    }

结论

通过这篇文章,我们介绍了如何使用 Java Stream API 根据对象的属性进行分组。我们定义了一个简单的 Person 类,创建了一组对象,并使用 Collectors.groupingBy() 方法对其进行分组。

学习使用 Stream API 为您的 Java 编程增添了强大的工具。希望您在以后的项目中能熟练运用这一技术!如果您有任何问题,请随时提问。