JAVA8_STREAM

JAVA8_STREAM

StreamJava8的一大亮点,是对容器对象功能的增强**

流的方法

  Stream的方法分为两种,一种是中间操作,一种是终端操作;

  中间操作(Intermediate Operations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个中间操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行;中间操作包括

filter():过滤
map():映射
flatMap():
distinct():去重
sorted():排序
peek()
limit():限制条数
skip():跳过条数

  终端操作(Terminal Operations):是指返回最终的结果。一个流只能有一个terminal操作,当这个操作执行后,流就被使用了,无法再被操作。所以这必定是流的最后一个操作。Terminal操作的执行,才会真正开始流的遍历,并且会生成一个结果,或者一个 side effect;终端操作包括:

forEach()
forEachOrdered()
toArray()
reduce()
collect()
min()
max()
count()
anyMatch()
allMatch()
noneMatch()
findFirst()
findAny()
中间操作

  延迟执行是中间操作的一个重要特点,延迟执行是中间操作,延迟到遇到终端操作时,需要中间操作的结果,才会执行中间操作。 如下图,如果一个stream后面全是中间操作,那么这些中间操作是不会执行的,所以运行结果没有打印任何东西:

当随便加上一个终端操作时,流就会遍历并执行map方法中的打印:

  流只遍历一次,是流的另一个特性。比如一个list,中间操作有filter,map,sort,流的执行并不是先变量所有的元素,经过filter操作,再遍历所有元素,进行map操作。而是一个元素生成流,经过filter操作,然后进行map操作,再进行sort操作,最后经过终端操作。如果终端操作还没有结束,再进入下一个元素的循环。

下图就是一个例子,在map方法后面加了一个limit(1),从执行结果可以看出,是一个元素走完整个流程的,然后limit条件执行之后,不会再遍历下一个元素了:

待补充

  
原文地址:https://www.cnblogs.com/yanghanwen/p/14249351.html