Java8 Stream流原理分析(一)

1、Stream的优势

代码简单:函数式编程,使用Stream接口可以有效规避for循环的复杂运算

多核友好:Java函数式编程能够使得编写并行程序从未如此简单,如果需要的,直接调用一下parallel()方法即可。

Java8 Stream流原理分析(一)

这是常见的Stream接口继承关系图,图中4种Stream继承BaseStream,可以看到结构图中,Stream为不同数据据类型设置了不同的接口,

在这里你可能会奇怪为什么不把IntStream等设计成Stream子接口?毕竟接口中的方法名大部分都一样。

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

2、Stream的原理和特性

无存储

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

为函数式编程而生

对Stream的任何修改都不会修改背后的数据源,比如对Stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新的Stream。

惰性执行

Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。

可消费性

Stream流只能被“消费”一次,一旦遍历过就会失效,就想容器的迭代器那样,想要再次遍历必须重新生成。

3、Stream方法的简单介绍

对Stream的操作分为两类,中间操作结束操作,二者特点是:

中间操作总会惰性执行,调用中间操作只会生成一个标记该操作的新的Stream,仅此而已。中间操作又分为无状态和有状态,无状态中间菜哦做是指元素处理不受前面元素的影响,而有状态的中间操作必须等到所有元素处理之后才知道最终结果,比如排序是有状态的,在读取所有元素之前并不能确定排序结果

结束操作会触发实际计算,计算发生时会把所有的中间操作积攒以pipeline(有待进一步的考察)的方式执行,这样可以减少迭代次数。计算完成之后Stream就会失效。结束操作又可以分类短路操作和非短路操作,短路操作是指不用处理全部元素就可以返回结果,比如找到第一个满足条件的元素。之所以要细分,是因为Stream底层对每一种情况的处理方式不同(此处底层,待以后更新)。

Java8 Stream流原理分析(一)

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