什么是 Stream 流?
Stream 流(通常简称 “流”)是处理集合 / 序列数据的抽象工具,核心是通过 “声明式 API” 实现数据的过滤、转换、聚合等操作,本质是 “数据流 + 操作管道”—— 数据像水流一样在管道中流动,经过一系列 “中间操作” 加工,最终由 “终端操作” 产出结果。
它最早起源于函数式编程思想,后被主流编程语言(Java 8+、Python、JavaScript、C# 等)引入,核心目标是:简化数据处理代码、提高可读性,同时支持高效的并行处理。
一、核心特点(以 Java Stream 为例,其他语言思想相通)
1. 不存储数据,仅传递数据
Stream 本身不持有数据,数据来源于集合、数组、I/O 流等 “数据源”,Stream 只负责将数据从数据源传递到操作管道,处理后直接输出结果(不修改原数据源)。
2. 声明式编程,而非命令式
不用手动写 “循环遍历 + 条件判断 + 结果收集” 的逻辑(命令式),而是通过 “链式调用” 指定 “要做什么”(声明式),由 Stream 底层优化执行细节。
例子对比(筛选偶数并求和)
命令式(传统写法):
java
运行
Listlist = Arrays.asList(1, 2, 3, 4, 5); int sum = 0; for (int num : list) { // 手动遍历 if (num % 2 == 0) { // 手动判断 sum += num; // 手动累加 } } System.out.println(sum); // 结果:6 声明式(Stream 写法):
java
运行
Listlist = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream() .filter(num -> num % 2 == 0) // 中间操作:筛选偶数 .mapToInt(Integer::intValue) // 中间操作:转换为 int .sum(); // 终端操作:求和 System.out.println(sum); // 结果:6
3. 惰性求值(延迟执行)
- 中间操作(如
filter、map):仅记录操作逻辑,不立即执行; - 终端操作(如
sum、collect、forEach):触发整个管道的执行,执行后 Stream 自动关闭(不可重复使用)。
好处:Stream 会优化整个操作管道(比如 “短路求值”“合并操作”),避免不必要的计算,提升效率。
4. 支持并行处理
只需将 stream() 改为 parallelStream(),即可自动利用多线程并行处理数据,无需手动管理线程(底层依赖 Fork/Join 框架):
java
运行
int sum = list.parallelStream() // 并行流
.filter(num -> num % 2 == 0)
.sum();
二、Stream 操作的分类
所有 Stream 操作都分为两类,必须遵循 “多个中间操作 + 一个终端操作” 的结构:
| 类型 | 作用 | 特点 | 常见操作 |
|---|---|---|---|
| 中间操作 | 加工数据(过滤、转换、排序等) | 惰性执行,返回新的 Stream(支持链式) | filter、map、sorted、distinct |
| 终端操作 | 产出结果(求和、收集、遍历等) | 触发执行,关闭 Stream(不返回 Stream) | sum、collect、forEach、count |
三、常见使用场景
- 集合数据筛选 / 转换:从列表中筛选符合条件的元素,或转换为其他类型(如 List→Set、对象→属性);
- 数据聚合统计:求和、求平均值、找最大 / 最小值、计数等;
- 批量处理:对数组 / 集合中的元素批量执行操作(如修改属性、打印);
- 复杂数据处理:组合多个中间操作,实现多步骤数据加工(如 “筛选→排序→去重→收集”)。
四、不同语言的 Stream 类似概念
- Java:
java.util.stream.Stream(核心类,支持集合、数组、I/O 流); - Python:
itertools模块、生成器表达式(Generator)、pandas的DataFrame操作(类似流的声明式处理); - JavaScript:
Array.prototype的filter、map、reduce等方法(数组流操作)、RxJS(响应式流); - C#:
LINQ(Language Integrated Query,集成在语言中的查询能力,本质是流处理)。
总结
Stream 流的核心是 “数据管道化 + 声明式编程”:将数据处理逻辑拆分为一系列可组合的操作,屏蔽底层遍历和线程细节,让代码更简洁、易维护,同时支持高效的串行 / 并行处理。它是处理集合 / 序列数据的 “瑞士军刀”,尤其适合复杂数据加工场景。
浙公网安备 33010602011771号