什么是 Stream 流?

Stream 流(通常简称 “流”)是处理集合 / 序列数据的抽象工具,核心是通过 “声明式 API” 实现数据的过滤、转换、聚合等操作,本质是 “数据流 + 操作管道”—— 数据像水流一样在管道中流动,经过一系列 “中间操作” 加工,最终由 “终端操作” 产出结果。

它最早起源于函数式编程思想,后被主流编程语言(Java 8+、Python、JavaScript、C# 等)引入,核心目标是:简化数据处理代码、提高可读性,同时支持高效的并行处理

一、核心特点(以 Java Stream 为例,其他语言思想相通)

1. 不存储数据,仅传递数据

Stream 本身不持有数据,数据来源于集合、数组、I/O 流等 “数据源”,Stream 只负责将数据从数据源传递到操作管道,处理后直接输出结果(不修改原数据源)。

2. 声明式编程,而非命令式

不用手动写 “循环遍历 + 条件判断 + 结果收集” 的逻辑(命令式),而是通过 “链式调用” 指定 “要做什么”(声明式),由 Stream 底层优化执行细节。

例子对比(筛选偶数并求和)
  • 命令式(传统写法):

    java

    运行

    List list = 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

    运行

    List list = 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. 惰性求值(延迟执行)

  • 中间操作(如 filtermap):仅记录操作逻辑,不立即执行;
  • 终端操作(如 sumcollectforEach):触发整个管道的执行,执行后 Stream 自动关闭(不可重复使用)。

好处:Stream 会优化整个操作管道(比如 “短路求值”“合并操作”),避免不必要的计算,提升效率。

4. 支持并行处理

只需将 stream() 改为 parallelStream(),即可自动利用多线程并行处理数据,无需手动管理线程(底层依赖 Fork/Join 框架):

java

运行

int sum = list.parallelStream() // 并行流
              .filter(num -> num % 2 == 0)
              .sum();

二、Stream 操作的分类

所有 Stream 操作都分为两类,必须遵循 “多个中间操作 + 一个终端操作” 的结构:

类型作用特点常见操作
中间操作加工数据(过滤、转换、排序等)惰性执行,返回新的 Stream(支持链式)filtermapsorteddistinct
终端操作产出结果(求和、收集、遍历等)触发执行,关闭 Stream(不返回 Stream)sumcollectforEachcount

三、常见使用场景

  1. 集合数据筛选 / 转换:从列表中筛选符合条件的元素,或转换为其他类型(如 List→Set、对象→属性);
  2. 数据聚合统计:求和、求平均值、找最大 / 最小值、计数等;
  3. 批量处理:对数组 / 集合中的元素批量执行操作(如修改属性、打印);
  4. 复杂数据处理:组合多个中间操作,实现多步骤数据加工(如 “筛选→排序→去重→收集”)。

四、不同语言的 Stream 类似概念

  • Java:java.util.stream.Stream(核心类,支持集合、数组、I/O 流);
  • Python:itertools 模块、生成器表达式(Generator)、pandas 的 DataFrame 操作(类似流的声明式处理);
  • JavaScript:Array.prototype 的 filtermapreduce 等方法(数组流操作)、RxJS(响应式流);
  • C#:LINQ(Language Integrated Query,集成在语言中的查询能力,本质是流处理)。

总结

Stream 流的核心是 “数据管道化 + 声明式编程”:将数据处理逻辑拆分为一系列可组合的操作,屏蔽底层遍历和线程细节,让代码更简洁、易维护,同时支持高效的串行 / 并行处理。它是处理集合 / 序列数据的 “瑞士军刀”,尤其适合复杂数据加工场景。