Stream是jdk1.8提供的新的流式编程,它不是集合也不保存任何内容,可以像build对象一样,一直点点点最后跟一个终结语句;
研究Stream之前需要先了解:
• 不是数据结构,不保存数据;
• 不修改原始数据,会将产生的新数据保存到新对象中;
• 延迟操作,中间的操作只会记录,直到它弄清楚了最后需要多少数据才会开始执行;
• 拥有并行能力(基于Fork/Join框架);
• 数据源可以是无限的;
• 消费性,用完了不能再拿来用,只能重新生成新的stream;
注:对于基本数据类型,另外有三个包装Stream类型:IntStream、LongStream、DoubleStream,这三个类型跟Stream类稍微有些差别,例如不需要泛型、特有的方法等;
一个流后面可以跟0个或多个中间操作,主要是对数据做一些过滤映射操作,然后返回流交给下一个操作,中间操作是惰性的,只会记录操作过程,不会真正开始遍历数据;中间操作分无状态和有状态两种操作,无状态的每个元素可单独处理,跟其他元素无关联(filter,map),有状态的元素需要知道其他元素(distinct,sorted);在并行时,某些有状态的操作可能回遍历数据多次或者缓冲大量数据(sorted不适合用并行);
一个流只能有一个终止操作,必定是最后一个操作,执行完后流就被用完了不能再被使用,终止操作执行的时候才会真正开始遍历数据,返回数据或者执行一段代码;
中间操作的短路,会产生有限的流;终止操作的短路,会在有限时间内终止;
builder(), concat(Stream<? extends T>, Stream<? extends T>), empty(), generate(Supplier<T>), iterate(T, UnaryOperator<T>), of(T), of(T...)
(短路终止)元素都匹配返回true,否则false;(中间遇到不匹配立即返回flase)
(短路终止)存在匹配返回true,否则flase;(中间存在一个匹配立即返回true)
(终止)将流转换成集合和聚合元素;
(终止)返回流的元素数量;
(状态中间)去重,对于有序流保留第一个,无序流是随机的;
(中间)过滤元素;
(短路终止)返回流中任意一个元素;
(短路终止)返回流中第一个元素;
(终止)遍历,有序流ordered保证顺序(并行);
(中间)扁平映射,一个映射多个;
是否是并行流(继承方法);
返回流的迭代器(继承方法);
(短路状态中间)截断流的最大长度;
(中间)映射,一对一;
(终止)根据比较规则返回最大值
(终止)根据比较规则返回最小值(compare返回<=0则返回第一个)
(短路终止)没有相匹配的返回true,一旦匹配立即返回false;
关闭流(继承方法);
(中间)调用close()的时候触发,所有的onClose定义的runnable都会按添加顺序执行(即使有的runnable抛出异常),run中抛出的第一个异常将在close()方法中抛出,其他异常会作为抑制异常被添加到该抛出异常中(继承方法);
(中间)将流变成并行流(继承方法);
(中间)将流变成串行流(继承方法);
(中间)元素在结果流中被消耗时,额外对每个元素执行该操作;
(终止)对元素进行累加操作;
(状态中间)丢弃前n个元素,可能返回空流;
(状态中间)按自然元素排序;
(状态中间)根据比较器排序;
注:reversed()反向排序是对当前整个Comparator定义的排序取反;
(终止)返回流元素的拆分器(继承方法);
(终止)返回A[]元素数组(IntFunction的参数为元素个数);
(中间)返回一个无序的流(继承方法);
返回一个整数序列,不包括最后一个(静态方法);
返回一个整数序列,包括最后一个(静态方法);
(中间)转换成DoubleStream;
(中间)转换成LongStream;
(终止)返回算数平均值的OptionalDouble对象;
(中间)每个元素装箱成Integer对象,返回Stream<Integer>;
(终止)求和;
(终止)返回一个IntSummaryStatistics对象,该对象包括流元素的概要数据;
注:
一个小Demo:
从Stream.of也能看得出区别:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/FlyLikeButterfly/article/details/122404145
内容来源于网络,如有侵权,请联系作者删除!