Java8 Stream API深度解析:中间操作实例
4 浏览量
更新于2024-09-01
收藏 69KB PDF 举报
"Java8 Stream中间操作实例解析"
在Java 8中,Stream API的引入为处理集合数据提供了全新的方式,它支持函数式编程的概念,允许我们以声明性风格处理数据。Stream API的设计目标是能够方便地进行并行处理,同时保持代码简洁易读。
中间操作是Stream API中的一个重要组成部分,它们是惰性的,意味着它们不会立即执行,而是等待终端操作触发时才开始执行。中间操作可以连接在一起,形成一个流水线,每个操作都会返回一个新的Stream,以便进行后续的操作。以下是一些常见的中间操作及其功能:
1. filter(): 这个方法用于过滤出满足特定条件的元素。例如:
```java
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> filteredNums = nums.stream().filter(n -> n > 2).collect(Collectors.toList());
// filteredNums: [3, 4, 5]
```
这个例子中,`filter()`方法接收一个谓词(条件),返回一个新的Stream,其中包含原集合中大于2的元素。
2. map(): 这个方法用于将每个元素应用一个函数,生成一个新的Stream。例如:
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> lengths = names.stream().map(String::length).collect(Collectors.toList());
// lengths: [5, 3, 7]
```
在这里,`map()`方法将每个字符串转换为其长度。
3. flatMap(): 与`map()`类似,但用于将每个元素映射成另一个Stream,然后将所有这些Stream合并成一个单一的Stream。例如:
```java
List<String> words = Arrays.asList("Hello", "world");
List<Character> characters = words.stream()
.flatMap(word -> word.chars().boxed())
.collect(Collectors.toList());
// characters: [H, e, l, l, o, w, o, r, l, d]
```
`flatMap()`将每个单词拆分成字符,并将所有字符放入一个单一的Stream。
4. distinct(): 用于去除重复的元素,返回一个不包含重复元素的新Stream。例如:
```java
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 4, 4, 4);
List<Integer> uniqueNumbers = numbers.stream().distinct().collect(Collectors.toList());
// uniqueNumbers: [1, 2, 3, 4]
```
5. sorted(): 对Stream中的元素进行排序。可以是自然排序或自定义比较器排序。例如:
```java
List<Integer> unsorted = Arrays.asList(5, 3, 9, 1, 7);
List<Integer> sorted = unsorted.stream().sorted().collect(Collectors.toList());
// sorted: [1, 3, 5, 7, 9]
```
6. peek(): 类似于`map()`,但除了应用函数外,还会保留原始元素。主要用于调试,因为它的结果不会影响最终的Stream。例如:
```java
List<String> list = Arrays.asList("A", "B", "C");
list.stream().peek(System.out::println).collect(Collectors.toList());
// 输出: A, B, C
```
7. limit(): 限制Stream中元素的数量。例如:
```java
List<String> longList = Arrays.asList("One", "Two", "Three", "Four", "Five");
List<String> shortList = longList.stream().limit(3).collect(Collectors.toList());
// shortList: [One, Two, Three]
```
8. skip(): 跳过Stream中前n个元素。例如:
```java
List<String> list = Arrays.asList("First", "Second", "Third", "Fourth");
List<String> skipped = list.stream().skip(2).collect(Collectors.toList());
// skipped: [Third, Fourth]
```
终端操作是Stream操作的最后一步,它们会消耗Stream并产生结果。以下是一些常见的终端操作:
1. forEach(): 对Stream中的每个元素执行一个消费者操作。例如:
```java
List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
fruits.stream().forEach(System.out::println);
// 输出: Apple, Banana, Cherry
```
2. forEachOrdered(): 和`forEach()`类似,但确保元素按照Stream的顺序处理。
3. toArray(): 将Stream转换为数组。例如:
```java
int[] array = IntStream.range(1, 4).toArray();
// array: [1, 2, 3]
```
4. reduce(): 对Stream中的元素进行聚合操作,如求和、求积等。例如:
```java
int sum = Arrays.asList(1, 2, 3, 4, 5).stream().reduce(0, Integer::sum);
// sum: 15
```
5. collect(): 收集Stream中的元素到一个集合、映射或其他结构。例如:
```java
Map<String, Integer> nameLengths = names.stream()
.collect(Collectors.toMap(Function.identity(), String::length));
// nameLengths: {Alice=5, Bob=3, Charlie=7}
```
6. min() 和 max(): 找到Stream中最小或最大的元素。例如:
```java
OptionalInt minAge = people.stream().mapToInt(Person::getAge).min();
OptionalInt maxAge = people.stream().mapToInt(Person::getAge).max();
```
7. count(): 计算Stream中的元素数量。例如:
```java
long count = numbers.stream().filter(n -> n > 2).count();
// count: 4
```
8. anyMatch(), allMatch() 和 noneMatch(): 检查Stream中是否存在满足条件的元素,是否所有元素都满足条件,或是否没有元素满足条件。例如:
```java
boolean hasLongWord = words.stream().anyMatch(word -> word.length() > 5);
boolean allWordsStartWithA = words.stream().allMatch(word -> word.startsWith("A"));
boolean noWordsEndWithZ = words.stream().noneMatch(word -> word.endsWith("Z"));
```
9. findFirst() 和 findAny(): 在Stream中查找第一个或任意一个满足条件的元素。例如:
```java
Optional<String> firstLongWord = words.stream().filter(word -> word.length() > 5).findFirst();
Optional<String> anyCapitalizedWord = words.stream().filter(word -> word.startsWith("A")).findAny();
```
通过结合使用这些中间操作和终端操作,开发者可以构建出高效、可读性强的代码,处理各种集合数据处理任务。Java 8的Stream API大大提升了集合处理的能力,使其更适合大数据和并行计算。
2020-08-25 上传
2023-11-17 上传
2020-08-26 上传
2023-09-25 上传
2023-05-26 上传
2024-10-27 上传
2024-10-28 上传
2023-09-07 上传
2024-10-28 上传
weixin_38670186
- 粉丝: 8
- 资源: 945
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库