美文网首页码之初
Java8 Stream终端操作使用详解

Java8 Stream终端操作使用详解

作者: 庸人视角 | 来源:发表于2020-03-16 21:29 被阅读0次

前情回顾

前几篇讲了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),访问到有限的元素后就可以返回。

相关文章

网友评论

    本文标题:Java8 Stream终端操作使用详解

    本文链接:https://www.haomeiwen.com/subject/rsooehtx.html