Java8 多字段分组统计代码实战

版权申诉
5星 · 超过95%的资源 14 下载量 59 浏览量 更新于2024-09-12 收藏 103KB PDF 举报
"这篇文档提供了一个关于如何在Java 8中使用集合进行多字段分组统计个数的代码示例。通过这个示例,开发者可以学习到如何利用Java 8的Stream API和Lambda表达式来处理复杂的数据聚合操作。" 在Java 8中,集合API得到了显著增强,引入了Stream API,这使得处理数据变得更加简洁和高效。针对多字段的分组和统计个数,我们可以使用`groupingBy`函数配合其他流操作来实现。以下是一个基于Java 8的多字段分组统计个数的实例,假设我们有一个`User`实体类: ```java public class User { private Integer id; private String userName; private String password; private Integer age; private long c; // 构造方法、getter和setter省略... } ``` 为了统计`User`对象按年龄和用户名的组合出现的次数,我们可以这样做: ```java import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<User> userList = // 初始化User列表 Map<String, Map<Integer, Long>> result = userList.stream() .collect(Collectors.groupingBy( User::getUserName, Collectors.groupingBy(User::getAge, Collectors.counting()) )); for (Map.Entry<String, Map<Integer, Long>> entry : result.entrySet()) { System.out.println("UserName: " + entry.getKey()); for (Map.Entry<Integer, Long> ageCount : entry.getValue().entrySet()) { System.out.println(" Age: " + ageCount.getKey() + ", Count: " + ageCount.getValue()); } } } } ``` 在这个例子中,我们首先使用`stream()`方法将`List<User>`转换为一个流。然后,我们使用`collect()`方法,传入`Collectors.groupingBy()`,它接受两个参数:第一个参数是一个函数,用于决定分组的关键依据,这里是`User::getUserName`,即按照用户名进行分组;第二个参数是一个收集器,这里我们使用嵌套的`Collectors.groupingBy()`,内层的`User::getAge`表示按照年龄再次分组,并使用`Collectors.counting()`计算每个子组的数量。 最后,`result`变量会是一个`Map<String, Map<Integer, Long>>`,外层的键是用户名,内层的键是年龄,值是对应的用户数量。通过遍历这个结果,我们可以打印出每个用户名按年龄分组后的用户计数。 通过这种方式,Java 8的Stream API使得在处理集合时能够进行复杂的分组和统计操作,极大地提高了代码的可读性和效率。在实际开发中,这可以应用于数据分析、报表生成等多种场景。