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。

相关推荐
小小毛桃28 分钟前
在Ubuntu系统中运行Windows程序
linux·windows·ubuntu
Hanson Huang1 小时前
【数据结构】堆排序详细图解
java·数据结构·排序算法·堆排序
路在脚下@1 小时前
Redis实现分布式定时任务
java·redis
xrkhy1 小时前
idea的快捷键使用以及相关设置
java·ide·intellij-idea
巨龙之路2 小时前
Lua中的元表
java·开发语言·lua
小臭希2 小时前
python蓝桥杯备赛常用算法模板
开发语言·python·蓝桥杯
mosaicwang2 小时前
dnf install openssl失败的原因和解决办法
linux·运维·开发语言·python
花花鱼2 小时前
itext7 html2pdf 将html文本转为pdf
java·pdf
蹦蹦跳跳真可爱5892 小时前
Python----机器学习(基于PyTorch的乳腺癌逻辑回归)
人工智能·pytorch·python·分类·逻辑回归·学习方法
Bruce_Liuxiaowei2 小时前
基于Flask的Windows事件ID查询系统开发实践
windows·python·flask