Java8函数式编程之六 :Stream (流)介绍

来源:互联网 发布:卡通人物软件 编辑:程序博客网 时间:2024/04/27 10:52

上一篇博客我们介绍了Java8中的4种方法引用,这篇文章主要介绍Java8中非常重要的部分,也就是Stream(流)。
在此,建议你阅读Stream.java类的Java文档,毕竟是最权威的资料。
————————————————————

我们先来看一下Javadoc中对流是怎样说明的:

 A sequence of elements supporting sequential and parallel aggregate* operations.  The following example illustrates an aggregate operation using {@link Stream} and {@link IntStream}:* {@code*     int sum = widgets.stream()*                      .filter(w -> w.getColor() == RED)*                      .mapToInt(w -> w.getWeight())*                      .sum();* }

————————————————————————
简单的理解一下就是: 流是支持串行和并行聚合操作的元素序列。并且给你展示了一个简单的实例。

那么Java8为什么新增了流呢,如果你继续阅读Javadoc,你会发现流有以下关键特征。(也可以参考Java8 in action)。

1.源。 流有一个源,源可以是数组,集合,生成器函数,或者I/O通道等。
2.零个或多个中间操作(intermediate operations)
3.终止操作(terminal operation)

————————————————————

集合与流的比较:
1.集合是一种数据结构,主要目的在于存储和访问元素,而流的目的在于计算(比如后面会谈到的filter,map,find,reduce等)。
2.集合关注的是数据及数据的存储,流关注的是对数据的计算。
3.流不存储值,通过管道的方式获取值。
4.本质是函数式的,对流的操作会生成一个结果,不过并不会修改底层的数据源,集合可以作为流的底层数据源。

————————————————————
只能被消费一次:

——————————
中间操作和终止操作:
中间操作:一个流通过中间操作后返回的是一个新的流。
一个流可以后面跟随着零个或者多个中间操作。其目的是打开流,做出某种程度的数据映射/过滤,然后返回一个新的流,交给下一个操作使用,这类操作都是延迟的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。

终止操作:一个流经过终止操作后会生成一个结果。
一个流只能有一个终止操作,当这个操作执行后,流就被用光了,无法再执行操作。所以这必定是流的最后一个操作。终止操作执行后,才会真正开始流的遍历,并且会生成一个结果。

————————————
流是惰性的:
流是惰性的,意思是对源数据的计算只有在终止操作发生时才执行,而源数据只有在被需要时才消费。

————————————
这篇文章主要是为了解释流的概念,并没有具体的实例代码,下一篇文章中将会使用代码实例来解释流的各种操作。