Java 中的 Stream
是 Java 8 引入的一种处理集合(如 List、Set)数据的强大工具,它允许你以声明式(声明“做什么”而不是“怎么做”)的方式处理数据。Stream
不是数据结构,而是一种对数据源(集合、数组等)进行操作的抽象。
1. Stream 的核心特点
- 不是数据结构:它不会存储数据。
- 一次性使用:Stream 一旦被消费就不能再使用。
- 惰性执行:只有调用终止操作(如
collect()
、forEach()
)时才会执行。
- 链式操作:支持链式调用多个操作(filter、map、sorted…)。
- 支持并行处理:通过
parallelStream()
轻松实现并行处理。
2. Stream 的使用流程
通常包含三步:
- 创建流(Create a Stream)
- 中间操作(Intermediate Operations)
- 终止操作(Terminal Operation)
3. 举个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import java.util.*; import java.util.stream.*;
public class StreamExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Amanda");
List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .map(String::toUpperCase) .sorted() .collect(Collectors.toList());
System.out.println(filteredNames); } }
|
4. 常见的中间操作(返回 Stream)
方法 |
作用说明 |
filter() |
过滤元素 |
map() |
映射/转换元素 |
flatMap() |
扁平化处理嵌套结构 |
sorted() |
排序 |
distinct() |
去重 |
limit(n) |
限制前 n 个元素 |
skip(n) |
跳过前 n 个元素 |
peek() |
查看元素(通常用于调试) |
5. 常见的终止操作(触发流执行)
方法 |
作用说明 |
forEach() |
遍历每个元素 |
collect() |
收集结果到 List、Set、Map 等集合 |
count() |
统计数量 |
anyMatch() /allMatch() |
是否匹配某些条件 |
findFirst() /findAny() |
找到第一个/任意一个元素 |
reduce() |
归约(如求和、求乘积等) |
6. Stream 与 Optional、Lambda 的关系
Stream
依赖于 Lambda 表达式(如 n -> n.startsWith("A")
)来实现函数式处理。
- 和
Optional
类似,Stream
也体现了函数式编程风格。
Optional
也有类似 map
、filter
、flatMap
的方法。