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。

相关推荐
躺平大鹅5 分钟前
5个实用Python小脚本,新手也能轻松实现(附完整代码)
python
yukai0800810 分钟前
【最后203篇系列】039 JWT使用
python
figo10tf13 分钟前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva17 分钟前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端
橙露21 分钟前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
小程故事多_8022 分钟前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
冰暮流星22 分钟前
sql语言之分组语句group by
java·数据库·sql
望舒51324 分钟前
代码随想录day25,回溯算法part4
java·数据结构·算法·leetcode
黎雁·泠崖26 分钟前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖31 分钟前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言