Stream
Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
- Collection提供了新的stream()方法
- 流不存储值,通过管道的方式获取值
- 本质是函数式的,对流的操作会产生一个结果,不过并不会修改底层的数据源,集合可以作为流底层数据源
- 延迟查找,很多流操作(过滤、映射、排序等)都可以延迟实现
Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。
Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。
而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。
流由3部分构成:
- 源
- 零个或多个中间操作
- 终止操作
流操作的分类:
- 惰性求值(中间操作)
- 及早求值(终止操作)
创建流的几种方式
|
|
流的简单使用
|
|
进一步应用
|
|
Stream转换为数组和集合
|
|
map和flatMap
|
|
其他方法
|
|
中间操作和终止操作本质上的区别
中间操作都会返回一个Stream对象,比如说返回Stream
终止操作则不会返回Stream类型,可能不返回值,也可能返回其他类型的单个值。
|
|
|
|
串行流和并行流的区别
Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。
|
|
流的短路
|
|
flatMap的应用场景
|
|
进一步应用
|
|
分组:group by操作
|
|