本文,我们开始进入到Java8的Stream流编程概念及实际使用方式的学习。
Stream流是jdk1.8引入的新成员,通过声明式的方式处理集合数据(多通过lambda表达式方式进行展示)
它能够将基础操作链接起来,从而完成复杂的数据处理流水线
它也为开发者提供了透明的并行处理
《Java8实战》一书的解释为
流,是从支持 数据处理操作 的 源 生成的元素序列
集合是静态的概念,流是动态的概念。eg: DVD碟片是集合,播放中的一段视频是流集合面向的是存储,而流面向的计算
eg: 构造一个质数集合,这是做不到的,因为这个集合是无穷的 但是构造一个质数流是可以的,我们只需要不断的构造就可以了。
也就是说,集合在时间维度看是无穷的,而流在时间维度上看是有穷的。
流是动态概念,遍历之后就不存在了,再次遍历会出现异常
流由
数据源 中间操作(业务处理) 终端操作(将结果进行收集) 组成 如: cart(SkuList) -> [filter -> sorted -> map] -> collect
中间操作
1.1 无状态操作
(不需要建立在所有的数据上,只需要针对单个数据进行判断即可): filter、map、peek等, 具有局部性
1.2 有状态操作
(需要针对所有数据基础上): distinct、sorted、limit等,具有全局性
终端操作
1.1 非短路操作
(所有数据均执行): forEach、collect、count等
1.2 短路操作
(只要找到符合要求的就不需要继续执行了):anyMatch、findFirst、findAny
这里我们对常见的流的使用方法进行详细分类,承接上方 流操作的分类
中间操作(无状态)
过滤 filter 映射 map 扁平化 flatMap 遍历 peek
中间操作(有状态)
去重 distinct 跳过 skip 截断 limit 排序 sorted
终端操作(非短路)
遍历 forEach 规约 reduce 最大值 max 聚合 collect 最小值 min 计数 count
终端操作(短路)
所有匹配 allMatch 任意匹配 anyMatch 不匹配 noneMatch 查找首个 findFirst 查找任意 findAny
接下来,我们通过代码实例,挨个讲解一下这些方法的使用
版权声明:
原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。