前情回顾
前几篇讲了Java8中Stream流的简介,创建流的方式,以及Stream流中间操作的使用详解,想回顾的可以戳:
话不多说,自己挖的坑自己要填完,今天就给大家讲完Java8中Stream的终端操作使用详解。Stream流的终端操作主要有以下几种,我们来一一讲解。
forEach()
forEachOrdered()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findFirst()
findAny()
终端操作代码实例详解
1、forEach():遍历流中的每一个元素,按照指定的方法执行,执行顺序不一定按照流的顺序。
// foreach:遍历流中每一个元素,执行顺序按照流的顺序
运行结果:
1
2
3
4
5
6
2
1
6
5
3
4
2、forEachOrdered():遍历流中的每一个元素,按照指定的方法执行,执行顺序按照流的顺序。
// forEachOrdered():遍历流中每一个元素,执行顺序按照流的顺序
运行结果:
1
2
3
4
5
6
1
2
3
4
5
6
3、toArray():将流中的元素放入到一个数组中
// toArray():将流中的元素放入到一个数组中
运行结果:[ma, zhi, chu]
4、reduce():这个方法的主要作用是把 Stream 元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。从这个意义上说,字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce。
// reduce():字符串拼接
运行结果:
mazhichu
mazhichu
10
10
10
-6.6
5、collect():是Stream的一个函数,负责收集流。前面我们说中间操作是将一个流转换成另一个流,这些操作是不消耗流的,但是终端操作会消耗流,产生一个最终结果,collect()就是一个规约操作,将流中的结果汇总。结果是由传入collect()中的Collector定义的。
// collect():负责收集流,将结果汇总,比如将下面的流中的结果汇总到一个集合中去
运行结果:[91, 92, 93, 94, 95, 96, 97, 98, 99]
6、min():返回流中的最小值
// min():返回流中的最小值
运行结果:
1
1
7、max():返回流中的最大值
// max():返回流中的最大值
运行结果:
6
6
8、count():返回流中元素的数量
// count():返回流中元素的数量
运行结果:
5
3
9、anyMatch():Stream 中只要有一个元素符合传入的断言,就返回 true,否则返回false。
// anyMatch():判断流中数据是否有一个复合断言
运行结果:
true
false
false
10、allMatch():Stream 中所有元素都符合传入的断言时返回 true,否则返回false,流为空时总是返回true。
// allMatch():判断流中元素是否都符合断言条件
运行结果:
true
false
true
11、noneMatch():Stream 中所有元素都不满足传入的断言时返回 true,否则返回false。
// noneMatch():判断流中元素是否都不符合传入的断言条件
运行结果:
true
false
true
12、findFirst():总是返回流中的第一个元素,如果流为空,返回一个空的Optional.
// findFirst():返回流中的第一个元素
运行结果:
Optional[1]
true
1
Optional.empty
false
13、findAny():返回流中的任意一个元素即可,如果流为空,返回一个空的Optional.
// findAny():返回流中任意一个元素,
运行结果:
Optional[1]
true
1
Optional.empty
false
以上就是Stream的13个终端操作,流的操作是以管道的方式串起来的。流管道包含一个数据源,接着包含零到N个中间操作,最后以一个终端操作结束。下面我们来总结一下Stream流。
Stream有以下特性及优点
无存储。Stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
为函数式编程而生。对Stream的任何修改都不会修改背后的数据源,比如对Stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新Stream。
惰式执行。Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
可消费性。Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
对于无限数量的流,有些操作是可以在有限的时间完成的,比如limit(n) 或 findFirst(),这些操作可是实现"短路"(Short-circuiting),访问到有限的元素后就可以返回。