Java8 Stream API深度解析:中间操作实例
147 浏览量
更新于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 上传
2024-11-03 上传
2024-11-10 上传
2024-10-31 上传
2024-11-10 上传
2024-11-11 上传
weixin_38670186
- 粉丝: 8
- 资源: 945
最新资源
- ansible:遇到了无法完全消除的麻烦,可以通过SSH-opdrachten自动化。 zwang的自动执行工具。有关自动化的相关信息,请与相关人员联系
- linux项目工程资料-水星UD6S Linux驱动,适配了5.15.zip
- Seeed_Arduino_UltrathinLEDMatrix-master_2.7z
- bosh-utils:从bosh-agent和bosh-init提取的通用软件包
- command-center:〜.emacs.d和〜.bashrc等
- 智慧社区,采用Vue前端工程,更新node-modules后即可运行
- AnimalHeritage.java:Java继承的简单练习
- capstone
- 分布式电源接入对配电网影响分析
- FEUP-SDIS:在SDIS中开发的作品
- 复制时钟组件及时钟周期事件
- COGNIXIA_PYTHON:Cognixia Python JUMP培训
- Konsole Invaders-开源
- sqlalchemy-challenge
- money-manager:资金管理器是一个使用JavaScript,React,Node.js,Express.js构建的预算网络应用程序,可让您管理多个银行帐户并跟踪支出。该项目仍在建设中,尚未托管。该网站具有完全的移动响应能力。通过Express-Session启用会话。 Redis用于缓存。通过b-crypt和其他措施来实现安全性。我将在仪表板上工作,以尽快包含预算数据的图形和图表,并且应该在不久的将来托管该项目
- 易语言-Ring3进程内核查看,参照xuetr部分功能