Stream接口
继承关系
- 继承 BaseStream<T, Stream<T>>,BaseStream 继承 AutoCloseable
文档说明
- 流是一个元素的序列,支持串行与并行的聚合操作
-
除了对象引用流的 Stream,还有一些原生特化的版本:IntStream、LongStream、DoubleStream;这些特化版本也被称作流,并且保留着流本身具有的特性及限制
- 目的:减少装箱拆箱操作
- 继承关系:
- 均与 Stream 一样,继承 BaseStream<T, Stream<T>>,只是泛型变成了指定类型。所以,4种流是平行关系,并非继承关系
- 要想执行操作,流操作会被组合到一个流管道(Pipeline)中
- 一个流管道包含
- 一个源,可以是一个 array,或 collection,或 generator function(生成器),或 I/O 通道
- 零个或多个中间操作(会将一个流转换成另外一个流)
- 终止操作(会生成一个结果)
- 流是延迟的,对于源数据的计算,只有在终止操作被触发时,对源的计算才真正开始执行;源里面的数据只有在需要时才被消费
- 集合与流,虽然具有一定的相似性,但实现目标是不同的
- 集合主要关注其元素的高效管理与访问
- 与之相反,流并没有提供直接访问或操作当中元素的方式,相反,它关注的是如何声明式地描述其源,以及以聚合的方式在源上执行的计算操作
- 然而,如果所提供的流操作没有提供我们所期望的功能,那么还可以利用 iterator() 或 spliterator() 操作执行可控制的遍历
- 一个流管道,可以被看作是对源的一种查询
- 除非这个流被设计成可以并发式地修改(如 ConcurrentHashMap),否则会出现意料之外的错误情况(如:一个线程修改,另一个线程查询)
- 大多数的流操作会接收用户指定的行为作为参数(如放一个lambda表达式进去),为了保证得到正确的结果,这些行为的参数都必须满足下述条件
- 必须式非干扰的(它们不操作数据源)
- 大多数情况必须是无状态的(结果不依赖于任何在流管道操作中可能改变的状态)
- 一个流只能被操作一次(调用中间操作或终止操作)
- 流实现了 AutoCloseable,有一个 close() 方法
- 绝大多数情况下,流不需要关闭
-
只有当源为 I/O 通道时才需要关闭,此时,可以将资源声明在 try-with-resources 语句中
- 流管道可以以串行或并行的方式执行,这只是流的一个属性,流会根据初始化选项进行创建