
在Java 8中引入的Stream API为函数式编程提供了一种全新的方式。它允许我们以声明式的方式处理数据集合,使代码更加简洁、易读且易于维护。本文将介绍Stream API的10种妙用,帮助你更好地理解和应用这一强大的工具。
1. 过滤操作:筛选符合条件的元素
java
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
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
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
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
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
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
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); // 输出: true
boolean allHigh = employees.stream()
.allMatch(emp -> emp.getSalary() > 5000);
System.out.println(allHigh); // 输出: false
boolean noLowEarner = employees.stream()
.noneMatch(emp -> emp.getSalary() < 4000);
System.out.println(noLowEarner); // 输出: true
8. 查找元素:获取第一个或任意一个元素
java
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
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
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。