1 Stream接口
1.1 接口情况
java.util.stream接口下共有DoubleStream、LongStream、IntStream、Stream四个接口,如下图所示:
1.2 流的分类和使用
其中,Stream接口定义了许多方法,大体可以分为两类:
- 中间操作类
- 终端操作类
一般来说,流的使用可以概括为三件事:
- 一个数据源来执行一个查询
- 一个中间操作链,形成一条流的流水线
- 一个终端操作,执行流水线,并生成结果
1.3 结构图
2 中间操作
中间操作类的返回的是另一个流,即其返回值类型是流Stream。
例如,filter或sorted方法连接起来可以形成一个查询操作,除非流水线上触发一个终端操作,否则不会执行任何处理。
总之,中间操作只是各种操作的一个顺序上的联合,它们操作的对象是流,产生的对象也是各种各样的流,只有在终端操作之后才能显示最终的操作结果。
流的中间操作常有以下几种:
操作 | 类型 | 返回类型 | 操作参数 | 函数描述符 |
filter | 中间操作 | Stream T | Predicate T | T -> boolean |
map | 中间操作 | Stream R | Function T,R | T -> R |
limit | 中间操作 | Stream T | ||
sorted | 中间操作 | Stream T | Comparator T | (T,T) -> int |
distinct | 中间操作 | Stream T |
3 终端操作
流的终端操作会从流的流水线生成结果,其结果是任何不为流的值,比如List、Integer甚至是void。
常用的流的终端操作:
操作 | 类型 | 目的 |
forEach | 终端操作 | 消费流中的每个元素并对其应用Lambda。这一操作返回void |
count | 终端操作 | 返回流中元素的个数。这一操作返回long |
collect | 终端操作 | 把流归约成一个集合,比如List、Map甚至是I |