在Java 8中引入的Stream API为函数式编程提供了一种全新的方式。它允许我们以声明式的方式处理数据集合,使代码更加简洁、易读且易于维护。本文将介绍Stream API的10种妙用,帮助你更好地理解和应用这一强大的工具。
1. 过滤操作:筛选符合条件的元素
java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream().filter(name -> name.startsWith("A")).collect(Collectors.toList());
System.out.println(filteredNames); // 输出: [Alice]
2. 映射转换:将元素转换为另一种形式
java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());
System.out.println(nameLengths); // 输出: [5, 3, 7, 5]
3. 排序操作:对流中的元素进行排序
java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
System.out.println(sortedNames); // 输出: [Alice, Bob, Charlie, David]
4. 收集操作:将流转换为集合
java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Set<String> nameSet = names.stream().collect(Collectors.toSet());
System.out.println(nameSet); // 输出: [Alice, Bob, Charlie, David]
5. 去重操作:去除重复元素
java
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream().distinct().collect(Collectors.toList());
System.out.println(distinctNumbers); // 输出: [1, 2, 3, 4, 5]
6. 限制和跳过元素:获取或跳过指定数量的元素
java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");
List<String> limitedNames = names.stream().limit(3).collect(Collectors.toList());
System.out.println(limitedNames); // 输出: [Alice, Bob, Charlie]List<String> skippedNames = names.stream().skip(2).collect(Collectors.toList());
System.out.println(skippedNames); // 输出: [Charlie, David, Eve]
7. 匹配与统计:检查元素是否满足条件
java
List<Employee> employees = Arrays.asList(new Employee("Alice", 6000),new Employee("Bob", 4500),new Employee("Charlie", 7000)
);boolean hasHighEarner = employees.stream().anyMatch(emp -> emp.getSalary() > 6000);
System.out.println(hasHighEarner); // 输出: trueboolean allHigh = employees.stream().allMatch(emp -> emp.getSalary() > 5000);
System.out.println(allHigh); // 输出: falseboolean noLowEarner = employees.stream().noneMatch(emp -> emp.getSalary() < 4000);
System.out.println(noLowEarner); // 输出: true
8. 查找元素:获取第一个或任意一个元素
java
Optional<Employee> firstEmp = employees.stream().sorted(Comparator.comparing(Employee::getName)).findFirst();
System.out.println(firstEmp); // 输出: Optional[Employee{name='Alice', salary=6000}]Optional<Employee> anyEmp = employees.parallelStream().filter(emp -> emp.getSalary() > 5000).findAny();
System.out.println(anyEmp); // 输出: 可能返回 Alice 或 Charlie
9. 并行流:利用多核处理器提高性能
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> doubledNumbersParallel = numbers.parallelStream().map(n -> n * 2).collect(Collectors.toList());
System.out.println(doubledNumbersParallel); // 输出: [2, 4, 6, 8, 10]
10. 流的连接:合并两个流
java
Stream<String> stream1 = Stream.of("A", "B", "C");
Stream<String> stream2 = Stream.of("D", "E", "F");
Stream<String> concatenatedStream = Stream.concat(stream1, stream2);
concatenatedStream.forEach(System.out::println);
// 输出:
// A
// B
// C
// D
// E
// F
总结
Stream API为Java开发者提供了一种强大而简洁的方式来处理数据集合。通过上述10种妙用,我们可以看到Stream API在过滤、映射、排序、收集、去重、限制、跳过、匹配、统计、查找和并行处理等方面的应用。希望本文能帮助你更好地理解和应用Stream API,提升你的编程效率和代码质量。
操作类型 | 示例代码 | 说明 |
---|---|---|
过滤 | filter(name -> name.startsWith("A")) | 筛选符合条件的元素 |
映射 | map(String::length) | 将元素转换为另一种形式 |
排序 | sorted() | 对流中的元素进行排序 |
收集 | collect(Collectors.toSet()) | 将流转换为集合 |
去重 | distinct() | 去除重复元素 |
限制 | limit(3) | 获取前3个元素 |
跳过 | skip(2) | 跳过前2个元素 |
匹配 | anyMatch(emp -> emp.getSalary() > 6000) | 检查是否存在符合条件的元素 |
查找 | findFirst() | 获取第一个元素 |
并行流 | parallelStream() | 利用多核处理器提高性能 |
流的连接 | Stream.concat(stream1, stream2) | 合并两个流 |
通过这些操作,Stream API使处理数据集合变得更加简单和高效。希望这些示例能帮助你在实际开发中更好地应用Stream API。