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。

相关推荐
爱码小白几秒前
Python 异常处理 完整学习笔记
开发语言·python
c++之路15 分钟前
C++20概述
java·开发语言·c++20
Championship.23.2420 分钟前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
芝士就是力量啊 ೄ೨29 分钟前
Python如何编写一个简单的类
开发语言·python
橘子海全栈攻城狮34 分钟前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
胖虎喜欢静香39 分钟前
从零到一快速实现 Mini DeepResearch
人工智能·python·开源
逻辑驱动的ken40 分钟前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
HLJ洛神千羽41 分钟前
电脑右下角显示【周几或星期几】和【上下午】方法
windows
qq_392690661 小时前
Redis怎样应对Redis集群整体宕机带来的雪崩
jvm·数据库·python
ITHAOGE151 小时前
下载 | Windows Server 2025官方原版ISO映像!(4月更新、标准版、数据中心版、26100.32690)
服务器·windows·科技·微软·电脑