Java 根据 Stream 分组聚合

在Java编程中,我们经常需要对数据进行分组和聚合操作。Java 8 引入了 Stream API,它提供了一种声明式的方式来处理集合数据。本文将介绍如何使用 Java Stream API 进行分组和聚合。

旅行图

首先,我们通过一个旅行图来展示数据分组和聚合的过程。

journey
    title 数据分组聚合流程
    section 定义数据源
      step1: 定义数据源
    section 使用 Stream API
      step2: 使用 `Collectors.groupingBy` 进行分组
      step3: 使用 `Collectors.summing` 进行聚合
    section 得到结果
      step4: 打印结果

定义数据源

我们首先定义一个包含多个用户的列表,每个用户有一个名字和年龄属性。

List<User> users = Arrays.asList(
    new User("Alice", 25),
    new User("Bob", 30),
    new User("Charlie", 35),
    new User("David", 25),
    new User("Eve", 30)
);

这里,User 类定义如下:

class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and setters
}

使用 Stream API 进行分组和聚合

接下来,我们使用 Stream API 对用户列表进行分组和聚合。我们的目标是按年龄分组,并计算每个年龄组的总年龄。

Map<Integer, Integer> ageGroupTotal = users.stream()
    .collect(Collectors.groupingBy(
        User::getAge,
        Collectors.summingInt(User::getAge)
    ));

这里,我们使用了 Collectors.groupingBy 方法进行分组,它的第二个参数是另一个收集器,用于对分组后的数据进行聚合。在这个例子中,我们使用了 Collectors.summingInt 来计算每个年龄组的总年龄。

得到结果

最后,我们打印出分组聚合的结果。

ageGroupTotal.forEach((age, total) -> System.out.println("Age group " + age + " has a total age of " + total));

这将输出:

Age group 25 has a total age of 50
Age group 30 has a total age of 60
Age group 35 has a total age of 35

总结

通过使用 Java Stream API,我们可以方便地对数据进行分组和聚合操作。Collectors.groupingBy 方法结合其他收集器,如 Collectors.summingInt,可以轻松实现这一功能。这不仅提高了代码的可读性,还使得数据处理更加灵活和强大。

希望本文能帮助你更好地理解和使用 Java Stream API 进行分组和聚合。如果你有任何问题或建议,请随时留言讨论。