Stream
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,
可以执行非常复杂的查找、过滤和映射数据等操作
1,特性
1,不是数据结构,不会保存数据。
2,不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:peek方法可以修改流中元素)
3,惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算
2,串行流,并行流
Java8 中,Collection 新增了两个流方法,分别是 Stream()
和 parallelStream()
串行流(Stream):适合存在线程安全问题、阻塞任务、重量级任务,以及需要使用同一事务的逻辑。
并行流(parallelStream):适合没有线程安全问题、较单纯的数据处理任务。
简单区分: stream
是顺序流,由主线程按顺序对流执行操作,而parallelStream
是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:
如果流中的数据量足够大,并行流可以加快处速度。
除了直接创建并行流,还可以通过parallel()
把顺序流转换成并行流:
Optional<Integer> findFirst = list.stream().parallel().filter(x->x>6).findFirst();
3,Stream
Stream的操作可以分为两大类:中间操作
、终结操作
中间操作:会返回一个新的流,一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤
终结操作:指返回最终的结果。一个流只能有一个终结操作,当这个操作执行后,这个流就被使用“光”了,无法再被操作。所以
这必定这个流的最后一个操作。终结操作的执行才会真正开始流的遍历,并且会生成一个结果。
中间操作可分为:
无状态(Stateless)操作:指元素的处理不受之前元素的影响
有状态(Stateful)操作:指该操作只有拿到所有元素之后才能继续下去
终结操作可分为:
短路(Short-circuiting)操作:指遇到某些符合条件的元素就可以得到最终结果
非短路(Unshort-circuiting)操作:指必须处理完所有元素才能得到最终结果
4,说明
方法名称 | 说明 |
---|---|
allMatch | 必须全部都满足才会返回true |
anyMatch | 只要有一个条件满足即返回true |
noneMatch | 全都不满足才会返回true |
map | 接收一个函数作为参数,将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素 |
flatMap | 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流 |
filter | 返回结果生成新的流中只包含满足筛选条件的数据 |
limit | 返回指定数量的元素的流。返回的是 Stream 里前面的 n 个元素 |
skip | 和 limit()相反,将前几个元素跳过(取出)再返回一个流,如果流中的元素小于或者等于 n,就会返回一个空的流 |
sorted | 将流中的元素按照自然排序方式进行排序 |
distinct | 将流中的元素去重之后输出 |
peek | 对流中每个元素执行操作,并返回一个新的流,返回的流还是包含原来流中的元素 |
collect | 收集,从字面上去理解,就是把一个流收集起来,最终可以是收集成一个值也可以收集成一个新的集合 |
reduce | 归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作 |
归约:多变一
map
flatMap
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com