在现代Java开发中,Stream API已经成为了处理集合数据的强大工具之一。它提供了一种声明式编程方式,使得我们可以以更简洁、更易读的方式编写代码。本文将通过一系列示例来介绍如何使用Java Streams来操作List集合。
1. 简介
在Java 8中引入的Stream API允许我们以一种更加自然和高效的方式来处理集合。与传统的循环或迭代不同,Stream API允许我们通过管道式的方法来处理数据流。这些操作可以分为中间操作(如filter, map, distinct等)和终端操作(如collect, forEach, reduce等)。
2. 示例场景
假设我们有一个员工列表,其中包含了员工的名字、年龄和职位。我们将使用这个列表来演示不同的Stream操作。
2.1 定义 Employee 类
首先,我们需要定义一个简单的Employee类:
java
深色版本
1public class Employee {
2 private String name;
3 private int age;
4 private String position;
5
6 public Employee(String name, int age, String position) {
7 this.name = name;
8 this.age = age;
9 this.position = position;
10 }
11
12 // getters and setters
13}
2.2 创建 Employee List
接下来,我们创建一个Employee的列表:
java
深色版本
1List<Employee> employees = Arrays.asList(
2 new Employee("Alice", 30, "Developer"),
3 new Employee("Bob", 25, "Manager"),
4 new Employee("Charlie", 35, "Designer"),
5 new Employee("David", 40, "Developer")
6);
3. Stream 基本操作
3.1 过滤 Filter
假设我们要找到所有年龄大于30岁的员工:
java
深色版本
1List<Employee> olderEmployees = employees.stream()
2 .filter(employee -> employee.getAge() > 30)
3 .collect(Collectors.toList());
3.2 映射 Map
如果我们想获取所有员工的名字:
java
深色版本
1List<String> names = employees.stream()
2 .map(Employee::getName)
3 .collect(Collectors.toList());
3.3 排序 Sorted
我们可以按照员工年龄进行排序:
java
深色版本
1List<Employee> sortedEmployees = employees.stream()
2 .sorted(Comparator.comparingInt(Employee::getAge))
3 .collect(Collectors.toList());
3.4 分组 Grouping
分组是Stream API中的一个强大特性,我们可以按职位分组员工:
java
深色版本
1Map<String, List<Employee>> groupedByPosition = employees.stream()
2 .collect(Collectors.groupingBy(Employee::getPosition));
4. 更复杂的操作
4.1 并行流 Parallel Streams
并行流可以提高处理大量数据时的性能:
java
深色版本
1long totalAge = employees.parallelStream()
2 .mapToInt(Employee::getAge)
3 .sum();
4.2 减少 Reduce
我们可以使用reduce方法来计算所有员工的平均年龄:
java
深色版本
1OptionalDouble averageAge = employees.stream()
2 .mapToInt(Employee::getAge)
3 .average();
5. 结论
通过上述示例,我们可以看到Stream API不仅简化了集合处理的代码,还提供了强大的工具来处理数据。从简单的过滤到复杂的分组和并行处理,Stream API都是现代Java开发不可或缺的一部分。