20191213-Stream

什么是Stream

stream并不是某种数据结构,它只是数据源(数据源可以是一个数组,Java容器或I/O channel等)的一种视图。

常见的stream接口继承关系

在这里插入图片描述

stream接口继承自BaseStream,其中IntStream, LongStream, DoubleStream对应三种基本类型(int, long, double,注意不是包装类型),Stream对应所有剩余类型的stream视图。

为不同数据类型设置不同stream接口,可以 提高性能、增加特定接口函数。

为什么不把IntStream等设计成Stream的子接口?

这些方法的名字虽然相同,但是返回类型不同,如果设计成父子接口关系,这些方法将不能共存,因为Java不允许只有返回类型不同的方法重载

stream和collections的区别

  • 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
  • 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
  • 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  • 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

stream的操作分类

中间操作 (intermediate operations)和 结束操作 (terminal operations)

特点:

  • 中间操作总是会惰式执行,调用中间操作只会生成一个标记了该操作的新stream,仅此而已。
  • 结束操作会触发实际计算,计算发生时会把所有中间操作积攒的操作以pipeline的方式执行,这样可以减少迭代次数。计算完成之后stream就会失效。

—》区分中间操作和结束操作最简单的方法,就是看方法的返回值, 返回值为stream 的大都是中间操作,否则是结束操作

流的规约操作

规约操作(reduction operation)又被称作折叠操作(fold),是通过某个连接动作将所有元素汇总成一个汇总结果的过程。元素求和、求最大值或最小值、求出元素总个数、将所有元素转换成一个列表或集合,都属于规约操作。

Stream类库有两个通用的规约操作reduce()和collect(),也有一些为简化书写而设计的专用规约操作,比如sum()、max()、min()、count()等。

从入门到入土:Lambda完整学习指南,包教包会

猜你喜欢

转载自blog.csdn.net/fggsgnhz/article/details/103539493