Java 8 中的 Stream API 使用指南

自从 Java 8 引入了 Stream API,它已经成为处理集合数据的强大工具。Stream API 提供了一种高效且声明式的方式来处理数据集合,使得代码更加简洁和易读。本文将介绍一些常用的 Stream 方法,并通过示例代码来说明它们的使用方法。

1. filter - 过滤元素

filter 方法用于过滤出符合特定条件的元素。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);  
List<Integer> evenNumbers = numbers.stream()  
    .filter(n -> n % 2 == 0)  
    .collect(Collectors.toList());  
System.out.println(evenNumbers); // 输出: [2, 4, 6]  

2. map - 转换元素

map 方法用于将每个元素转换为另一个形式。

示例代码

ini 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");  
List<Integer> nameLengths = names.stream()  
    .map(name -> name.length())  
    .collect(Collectors.toList());  
System.out.println(nameLengths); // 输出: [5, 3, 7]  

3. flatMap - 展平元素

flatMap 方法用于将多个流合并成一个流。

示例代码

scss 复制代码
List<List<Integer>> numberLists = Arrays.asList(  
    Arrays.asList(1, 2),  
    Arrays.asList(3, 4),  
    Arrays.asList(5, 6)  
);  
List<Integer> flatNumbers = numberLists.stream()  
    .flatMap(list -> list.stream())  
    .collect(Collectors.toList());  
System.out.println(flatNumbers); // 输出: [1, 2, 3, 4, 5, 6]  

4. distinct - 去重

distinct 方法用于去除重复的元素。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);  
List<Integer> uniqueNumbers = numbers.stream()  
    .distinct()  
    .collect(Collectors.toList());  
System.out.println(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]  

5. sorted - 排序

sorted 方法用于对流中的元素进行排序。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(5, 3, 2, 4, 1);  
List<Integer> sortedNumbers = numbers.stream()  
    .sorted()  
    .collect(Collectors.toList());  
System.out.println(sortedNumbers); // 输出: [1, 2, 3, 4, 5]  

6. limit - 限制元素数量

limit 方法用于限制流中返回的元素数量。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);  
List<Integer> limitedNumbers = numbers.stream()  
    .limit(5)  
    .collect(Collectors.toList());  
System.out.println(limitedNumbers); // 输出: [1, 2, 3, 4, 5]  

7. skip - 跳过元素

skip 方法用于跳过流中的前 n 个元素。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);  
List<Integer> skippedNumbers = numbers.stream()  
    .skip(5)  
    .collect(Collectors.toList());  
System.out.println(skippedNumbers); // 输出: [6, 7, 8, 9, 10]  

8. forEach - 遍历元素

forEach 方法用于遍历流中的每个元素。

示例代码

rust 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");  
names.stream()  
    .forEach(name -> System.out.println(name));  
// 输出:  
// Alice  
// Bob  
// Charlie  

9. reduce - 聚合操作

reduce 方法用于将流中的元素聚合为一个值。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
Optional<Integer> sum = numbers.stream()  
    .reduce((a, b) -> a + b);  
sum.ifPresent(System.out::println); // 输出: 15  

10. collect - 收集结果

collect 方法用于将流中的元素收集到一个集合或其他容器中。

示例代码

ini 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");  
String concatenatedNames = names.stream()  
    .collect(Collectors.joining(", "));  
System.out.println(concatenatedNames); // 输出: Alice, Bob, Charlie  

11. anyMatch - 检查是否至少有一个元素匹配条件

anyMatch 方法用于检查流中是否有至少一个元素匹配给定的条件。

示例代码

ini 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");  
boolean anyStartsWithA = names.stream()  
    .anyMatch(name -> name.startsWith("A"));  
System.out.println(anyStartsWithA); // 输出: true  

12. allMatch - 检查所有元素是否匹配条件

allMatch 方法用于检查流中的所有元素是否都匹配给定的条件。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(2, 4, 6, 8);  
boolean allEven = numbers.stream()  
    .allMatch(n -> n % 2 == 0);  
System.out.println(allEven); // 输出: true  

13. noneMatch - 检查没有元素匹配条件

noneMatch 方法用于检查流中没有任何元素匹配给定的条件。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 3, 5, 7);  
boolean noneEven = numbers.stream()  
    .noneMatch(n -> n % 2 == 0);  
System.out.println(noneEven); // 输出: true  

14. findFirst - 查找第一个元素

findFirst 方法用于查找流中的第一个元素。

示例代码

ini 复制代码
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");  
Optional<String> first = names.stream()  
    .findFirst();  
first.ifPresent(System.out::println); // 输出: Alice  

15. count - 计算元素数量

count 方法用于计算流中的元素数量。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
long count = numbers.stream()  
    .count();  
System.out.println(count); // 输出: 5  

16. max - 查找最大值

max 方法用于查找流中的最大值。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
Optional<Integer> max = numbers.stream()  
    .max(Integer::compare);  
max.ifPresent(System.out::println); // 输出: 5  

17. min - 查找最小值

min 方法用于查找流中的最小值。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
Optional<Integer> min = numbers.stream()  
    .min(Integer::compare);  
min.ifPresent(System.out::println); // 输出: 1  

18. peek - 调试中间操作

peek 方法用于在流的中间操作中进行调试,输出每个元素的信息。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
List<Integer> squaredNumbers = numbers.stream()  
    .peek(System.out::println)  
    .map(n -> n * n)  
    .collect(Collectors.toList());  
System.out.println(squaredNumbers); // 输出: [1, 4, 9, 16, 25]  

19. toArray - 转换为数组

toArray 方法用于将流中的元素转换为数组。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
Integer[] numberArray = numbers.stream()  
    .toArray(Integer[]::new);  
System.out.println(Arrays.toString(numberArray)); // 输出: [1, 2, 3, 4, 5]  

20. sum - 计算总和

sum 方法用于计算流中数值元素的总和。

示例代码

ini 复制代码
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);  
int sum = numbers.stream()  
    .mapToInt(Integer::intValue)  
    .sum();  
System.out.println(sum); // 输出: 15  

这些方法只是 Stream API 的一部分,但它们已经足够强大,可以处理大多数常见的集合操作。希望这些示例能帮助你更好地理解和使用 Java 8 中的 Stream API。

相关推荐
勇哥java实战分享9 分钟前
短信平台 Pro 版本 ,比开源版本更强大
后端
学历真的很重要14 分钟前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn089517 分钟前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪33 分钟前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端
韩师傅1 小时前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端
栈与堆2 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥2 小时前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似2 小时前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡2 小时前
Java CompletableFuture 接口与原理详解
后端
神奇小汤圆2 小时前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端