一、简介
在 Java 8 之前,处理复杂的集合数据通常需要循环、条件判断、集合操作等繁琐的代码。而 Stream API 提供了一种声明式的方式处理数据,它允许我们以一种更加自然的方式来表达我们的意图。
二、准备工作
为了演示 Stream API 的强大功能,我们先定义一个简单的数据模型:
java
深色版本
1public class Employee {
2 private String name;
3 private int age;
4 private Department department;
5
6 // Getters, setters, and constructors...
7}
8
9public class Department {
10 private String name;
11 private List<Employee> employees;
12
13 // Getters, setters, and constructors...
14}
三、多层嵌套数据处理
假设我们有一个包含多个部门的列表 List<Department>,每个部门包含多个员工。要找到所有年龄超过 30 岁的员工,我们可以这样实现:
java
深色版本
1List<Employee> oldEmployees = departments.stream()
2 .flatMap(department -> department.getEmployees().stream())
3 .filter(employee -> employee.getAge() > 30)
4 .collect(Collectors.toList());
这里的关键在于使用 flatMap 方法来扁平化嵌套的流。
四、分组与聚合
如果我们要按部门对员工进行分组,并统计每个部门的平均年龄,可以这样做:
java
深色版本
1Map<Department, Double> averageAgesByDepartment = departments.stream()
2 .collect(Collectors.groupingBy(
3 Department::getEmployees,
4 Collectors.averagingInt(Employee::getAge)
5 ));
这个例子中,我们使用 Collectors.groupingBy 和 Collectors.averagingInt 来完成分组和计算平均值的操作。
五、复杂过滤
有时候我们需要更复杂的过滤逻辑。例如,找出所有年龄大于 30 并且部门名称为 "IT" 的员工:
java
深色版本
1List<Employee> itOldEmployees = departments.stream()
2 .flatMap(department -> department.getEmployees().stream())
3 .filter(employee -> employee.getAge() > 30 && "IT".equals(employee.getDepartment().getName()))
4 .collect(Collectors.toList());
六、高级示例:多级分组
假设我们需要根据部门和年龄区间(例如 20-30、31-40)对员工进行分组:
java
深色版本
1Map<Department, Map<String, List<Employee>>> groupedByDepartmentAndAgeRange = departments.stream()
2 .flatMap(department -> department.getEmployees().stream())
3 .collect(Collectors.groupingBy(
4 Employee::getDepartment,
5 Collectors.groupingBy(employee -> {
6 int age = employee.getAge();
7 if (age >= 20 && age <= 30) return "20-30";
8 else if (age >= 31 && age <= 40) return "31-40";
9 else return "Other";
10 })
11 ));
七、总结
通过使用 Stream API,我们能够以简洁优雅的方式处理复杂的集合操作。这种方式不仅提高了代码的可读性,也使得维护变得更加简单。
希望这篇文章能帮助你更好地理解和运用 Java 8 的 Stream API。