Java Stream使用及原理分析
Stream API 入门
Streamn API 基本介绍
Stream不是集合元素,不是数据结构并不保存数据,如同一个迭代器(Iterator),单 向,不可往复,数据只能遍历一次。
而和迭代器不同的是stream可以并行化操作,并行遍历时,数据会被分成多个段,其中每一段都在不同线程中处理,然后将结果一起输出。
Stream API 特性
- 代码简洁:代码高效率、干净、简洁;
- 多核友好: 函数式编程边写并行程序简单(parallel());
Stream 与 Collections区别
- 无存储: stream不是一种数据结构,只是数据源的一个视图;
- 函数式编程:对stream的任何操作不会修改数据源,只会产生新的stream;
- 惰式执行: stream上的操作不会立即执行,需要到结束操作时候才会执行;
- 可消费性: stream只能被“消费”一次,一旦遍历过就会失效,类似容易的迭代器;
Stream 操作流程
stream一般有三个操作步骤:
- 构造stream: 从一个数据源(集合、数组等)中获取流;
- 中间操作:一个流后可跟随零个或多个中间操作,其目的是打开流,做出某种程度的数据映射/过滤,返回一个新的流,这类操作都是惰性的,仅仅调用这类方法,并没有开始流的遍历;
- 终止操作: 一个流只能有一个终止操作,会将所有中间操作以pipeline的方式执行,减少迭代次数,操作完之后stream就会失效;

表1.1 stream操作分类
| 操作分类 | ||
|---|---|---|
| 中间操作(Intermediate operations) | 无状态(Stateless) | unordered() filter() map() mapToInt() mapToLong() mapToDouble() flatMap() flatMapToInt() flatMapToLong() flatMapToDouble() peek() |
| 有状态(Stateful) | distinct() sorted() sorted() limit() skip() | |
| 结束操作(Terminal operations) | 非短路操作 | forEach() forEachOrdered() toArray() reduce() collect() max() min() count() |
| 短路操作(short-circuiting) | anyMatch() allMatch() noneMatch() findFirst() findAny() |
无状态中间操作是指元素的处理不受前面元素的影响;
有状态的中间操作必须等到所有元素处理之后才知道最终的结果,比如排序,在读取所有元素之前并不能确定排序结果;
短路操作指不用处理全部元素就可以返回结果,如findFirst();
非短路操作表示要处理完全部元素才返回结果;
Stream中间操作
stream一系列操作必须要使用终止操作,否则整个数据流是不会流动的,即处理操作不会执行。
map
map操作符入参为function的函数,功能将T类型转换成R类型;

返回一个对当前所有元素执行map之后组成的stream。

mapToInt、mapToLong、mapToDouble
mapToInt将数据流中元素转为int,最终产生的流为IntStream;

mapToLong类似,转为long型


flatmap
将元素拍平拍扁,将拍扁的元素重新组成stream,并将这些stream串行合并成一条stream

flatmapToInt、flatmapToLong、flatmapToDouble
类似于flatmap,只是类型被限定了。
limit
限制元素的个数,只需要传入long型,表示限制的最大数

distinct
将根据equals方法进行判断,可以重写equals方法自定义去重;

filter
对某些元素进行过滤,不符合筛选条件的元素将无法进入流的下游

peek
将元素挑选出来

skip
跳过元素

sorted
排序,底层依赖Comparable实现,可重写自定义排序方式


Stream结束操作
forEach、forEachOrdered
遍历迭代,其中forEachOrdered适用于并行流下进行迭代,保证迭代的有序性

collect
将数据流收集到容器Collector中

注意这个forEach是容器的forEach方法
count
统计数据流中元素的个数,返回类型为long

min/max

获取最小值(如果流为空则没有最小值),入参为比较器,返回类型为Optional

reduce
reduce是一个规约操作,所有的元素规约成一个,比如对所有元素求和,乘积等。

reduce三种传参方式,上图这种

第一个参数表示总结变量的初始值
toArray


toArray将流转成数组,可以提供自定义生成器
findFirst

获取流中第一个元素,返回类型为Optional

findAny
获取流中任意一个元素,返回类型同样为Optional

noneMatch、allMatch、anyMatch

数据流中是否没有元素与条件匹配,返回类型为boolean

allMatch全匹配,anyMatch任意匹配,与noneMatch类似
原博:
1、https://www.cnblogs.com/CarpenterLee/p/6545321.html
2、https://www.jianshu.com/p/11c925cdba50
本文深入解析Java Stream API的使用及原理,对比集合操作,强调Stream的特性如代码简洁、多核友好、惰性执行和可消费性。详细介绍Stream操作流程,包括构造、中间操作和终止操作,以及各种操作如map、filter、sorted的使用方法。
869

被折叠的 条评论
为什么被折叠?



