Java函数式编程魔法:Stream API的10种妙用

在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。

相关推荐
q56731523几秒前
Java Selenium反爬虫技术方案
java·爬虫·selenium
张小洛3 分钟前
Spring IOC容器核心阶段解密:★Bean实例化全流程深度剖析★
java·后端·spring·ioc容器·bean实例化
阿幸软件杂货间6 分钟前
Windows 10 2016 长期服务版
windows·系统·win10
Vertira9 分钟前
pdf 合并 python实现(已解决)
前端·python·pdf
不良手残13 分钟前
IDEA类和方法注释模板设置-保姆教程
java·开发语言
太凉13 分钟前
Python之 sorted() 函数的基本语法
python
GoodStudyAndDayDayUp18 分钟前
调用海康API预览视频
java·海康
李迟23 分钟前
在Linux服务器上使用kvm创建虚拟机
java·linux·服务器
Dcs23 分钟前
6 个 PWA 高阶策略,助你提升用户留存与参与度
java
hdsoft_huge28 分钟前
Spring Boot 高并发框架实现方案:数字城市的奇妙之旅
java·spring boot·后端