# Stream

Stream 相当于高级版的 Iterator，可以通过 Lambda 表达式对集合进行各种非常便利、高效的聚合操作（Aggregate Operation），大批量数据操作（Bulk Data Operation）。

在 Java 8 中，Collection 接口新增了两个 Stream 相关的接口：

```java
default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}
```

Stream 的操作可以按照如下分类：

* 中间操作（Intermediate operations）： 对操作进行记录，只返回一个流，不会进行计算。
  * 无状态（Stateless）：元素处理不受之前元素的影响。
  * 有状态（Stateful）：只有拿到所有元素才能继续。
* 终结操作（Terminal operations）：触发计算。
  * 短路（Short-circuiting）：遇到某些符合条件的元素就可以得到最终结果。
  * 非短路（Unshort-circuiting）：必须处理完所有元素才能得到最终结果。

![](https://3232244687-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYZow-MmROshIrkwdtE%2F-LgR4HYFM3WdRetzg0Cw%2F-LgR7nBUZoE5R5msJGrv%2Fimage.png?alt=media\&token=9d3e2420-cad1-4a32-b07d-039717d9712b)

![](https://3232244687-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYZow-MmROshIrkwdtE%2F-LgR4HYFM3WdRetzg0Cw%2F-LgR7vP6uZFSGih8qnDj%2Fimage.png?alt=media\&token=4ffedf52-7f5e-4c51-8d49-f89a0bd3944a)

* BaseStream：定义了流的基本方法，如 isParallel。
* Stream：定义了流的常用操作，如 map、filter。
* ReferencePipeline：定义了 Head、StatelessOp、StatefulOp 内部类来组装各种操作流。
  * Head：定义数据源操作，比如调用 stream() 方法。
* Sink：定义每个 Stream 操作之间关系的协议。
