Java Stream流详解
Java 8 引入了一个全新的 Stream API,该 API 可以让你以一种声明式的方式处理数据。Stream API 提供了一种高效且易于使用的数据处理机制,特别是它可以与 lambda 表达式一起使用,使得代码既简洁又易读。
1. 中间操作
Stream API 提供了多种中间操作,每个操作都会返回一个新的 Stream 对象,这些操作的结果可以链式调用。
1.1 Filter(过滤)
Filter 用于对 Stream 中的数据进行过滤,只保留满足条件的元素。
```java
stream.filter(e -> e.startsWith("a")).forEach(System.out::println);
```
1.2 Map(转换)
Map 用于将 Stream 中的元素转换为另一种形式的元素。
```java
stream.map(String::toUpperCase).forEach(System.out::println);
```
1.3 Sorted(排序)
Sorted 用于将 Stream 中的元素进行排序,可以自定义排序规则。
```java
stream.sorted().forEach(System.out::println);
```
1.4 Distinct(去重)
Distinct 用于去除 Stream 中的重复元素。
```java
stream.distinct().forEach(System.out::println);
```
1.5 Limit(限制)
Limit 用于获取 Stream 中的前 n 个元素。
```java
stream.limit(3).forEach(System.out::println);
```
1.6 Skip(跳过)
Skip 用于跳过 Stream 中的前 n 个元素。
```java
stream.skip(3).forEach(System.out::println);
```
1.7 Peek(展示)
Peek 用于展示每个元素,常用于调试。
```java
stream.peek(System.out::println).forEach(e -> {});
```
2. 终止操作
终止操作用于产生一个最终的结果或者副作用。
2.1 forEach(循环)
遍历 Stream 中的每个元素。
```java
stream.forEach(System.out::println);
```
2.2 Collect(收集)
将 Stream 中的元素收集到一个集合中。
```java
List<String> list = stream.collect(Collectors.toList());
```
2.3 Count(计数)
计算 Stream 中的元素数量。
```java
long count = stream.count();
```
2.4 Reduce(聚合)
将 Stream 中的元素进行聚合。
```java
Optional<Integer> sum = stream.reduce(Integer::sum);
```
2.5 AnyMatch(任意匹配)
判断 Stream 中是否有任意一个元素满足给定的条件。
```java
boolean anyMatch = stream.anyMatch(e -> e.startsWith("a"));
```
2.6 AllMatch(全部匹配)
判断 Stream 中的所有元素是否都满足给定的条件。
```java
boolean allMatch = stream.allMatch(e -> e.startsWith("a"));
```
2.7 NoneMatch(无匹配)
判断 Stream 中的所有元素是否都不满足给定的条件。
```java
boolean noneMatch = stream
.noneMatch(e -> e.startsWith("a"));
```
3. 使用Stream流的优缺点
优点:
1. 代码简洁:使用 Stream API 可以让你的代码变得更加简洁,更易于阅读和维护。
2. 支持并行处理:Stream API 支持并行处理,可以很好地利用多核处理器的优势,大大提高代码的运行效率。
3. 延迟执行:Stream API 的许多操作都是延迟执行的,只有当需要结果的时候才会开始执行,这种方式可以减少不必要的计算。
缺点:
1. 学习成本:对于初学者来说,Stream API 的学习成本相对较高。
2. 调试困难:由于 Stream 的链式操作和内部迭代的特性,调试 Stream 的代码可能会比较困难。
3. 无法复用:Stream 无法被复用,一旦被遍历或者调用终止操作,就会被关闭。
4. 怎么用?
这里是一个简单的例子,使用 Stream API 来处理一组数据:
```java
List<String> list = Arrays.asList("apple", "banana", "cherry", "apple", "cherry");
list.stream() // 创建 Stream
.filter(s -> s.length() > 5) // 过滤
.map(String::toUpperCase) // 转换
.sorted() // 排序
.distinct() // 去重
.limit(3) // 限制
.skip(1) // 跳过
.forEach(System.out::println); // 循环输出
```