java8 Stream 总结

本文深入解析Java Stream API的使用及原理,对比集合操作,强调Stream的特性如代码简洁、多核友好、惰性执行和可消费性。详细介绍Stream操作流程,包括构造、中间操作和终止操作,以及各种操作如map、filter、sorted的使用方法。

Stream API 入门

Streamn API 基本介绍

Stream不是集合元素,不是数据结构并不保存数据,如同一个迭代器(Iterator),单 向,不可往复,数据只能遍历一次。
而和迭代器不同的是stream可以并行化操作,并行遍历时,数据会被分成多个段,其中每一段都在不同线程中处理,然后将结果一起输出。

Stream API 特性

  1. 代码简洁:代码高效率、干净、简洁;
  2. 多核友好: 函数式编程边写并行程序简单(parallel());

Stream 与 Collections区别

  1. 无存储: stream不是一种数据结构,只是数据源的一个视图;
  2. 函数式编程:对stream的任何操作不会修改数据源,只会产生新的stream;
  3. 惰式执行: stream上的操作不会立即执行,需要到结束操作时候才会执行;
  4. 可消费性: stream只能被“消费”一次,一旦遍历过就会失效,类似容易的迭代器;

Stream 操作流程

stream一般有三个操作步骤:

  1. 构造stream: 从一个数据源(集合、数组等)中获取流;
  2. 中间操作:一个流后可跟随零个或多个中间操作,其目的是打开流,做出某种程度的数据映射/过滤,返回一个新的流,这类操作都是惰性的,仅仅调用这类方法,并没有开始流的遍历;
  3. 终止操作: 一个流只能有一个终止操作,会将所有中间操作以pipeline的方式执行,减少迭代次数,操作完之后stream就会失效;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值