集合框架(2)-什么是stream?

stream是一系列的值。包java.util.stream defines定义了引用值(Stream)的stream类型和一些原语stream类(IntStream,LongStream和DoubleStream)。streams类就像迭代器,它们按处理需求产生元素,但不与任何特定的存储机制关联。stream有时候局部计算-它们中某些元素仍会生成,有时候它的元素会全部参与计算,此时会结束stream。stream可以将数组、集合、生成函数或者一个IO通道作为它的数据源;它也可以是另一个stream的操作结果(见下文)。一种可部分计算流可以有无穷多个元素生成,例如来源于生成函数。

stream类型定义中间的操作(从而产生新的数据流),例如map,和最终操作(导致非流值),如forEach。对中间操作的调用通常以一种流式风格的API链接在一起,形成了一个管道(如前所述)。最终操作,正如它的名字所暗示的,终止方法链。最终操作又被称为“及早操作”,因为调用会导致立即从管道中消费值,而中间操作也叫“懒操作”,只会按需产生值。例如,假设strings被声明为List<String>,代码:
     IntStream ints = strings.stream().mapToInt(s -> s.length()).filter(i -> i%2 != 0);


启动一个管道,首先生成一个相应于字符串值长度int值的stream,然后仅在奇数时通过。但是对于声明为ints的结果来说什么也没发生。当有像这样的语句时才发生处理
    
ints.forEach(System.out::println);

使用一个及早最终操作来将管道中的值取出。
下表显示了流操作的一个小示例。为简单起见选择了这些例子,出于同样的原因,方法签名中的有界泛型类被替换成了其界类型。

集合框架(2)-什么是stream?_第1张图片

streams可以是有序或者无序的。stream的来源是数组、链表或者生成函数是有序的,来源是集合是无序的。顺序是由最中间操作保存;异常进行排序,其中规定了先前存在是有序的还是无序,从而消除了存在于接收器的任何顺序。在有些情况下会提供这种操作:最终操作的顺序不明显但开发者想更高效的利用这些操作,其在某些无序的stream上并行操作比串行操作更高效。大多数最终操作遵循顺序;例如toArray,被称为一个有序流,按元素顺序创建一个数组。forEach是个例外;其流中元素处理的顺序是不定的。

原文链接:http://www.lambdafaq.org/what-is-a-stream/

你可能感兴趣的:(Stream)