究竟是什么Java8的流?

时间:2015-04-08 04:57:01

标签: java java-8 java-stream

我已阅读 Java 8 In Action 因此我知道什么是Stream以及如何使用它。但从计算机科学的角度来看,所有数据都需要存储在一种数据结构中。所以,

  1. 如何存储Stream?

  2. Stream如何能够为如此多种集合(例如,数组,链表,地图)执行如此多的操作?

  3. 或者Stream可能只是一个接口,需要各种集合来实现此接口中指定的这些操作?

  4. 谢谢!

3 个答案:

答案 0 :(得分:5)

与Collection相比,Stream的一个重要区别是,Stream应该进行延迟评估。摘一下JavaDoc的摘录

  流是懒惰的;源数据的计算仅在启动终端操作时执行,源元素仅在需要时使用。

拥有Stream实例并不能保证该Stream的所有元素都是已知的。 Stream的元素仅在需要时计算。这反映了其他功能语言(如Haskell或Scala)中的功能。您将使用Stream来模拟无限列表。例如,可以计算斐波纳契数列的流。它只会计算所请求的元素。它不会计算所有元素,因为它永远不会完成。

因此,假设您始终可以存储Stream的内容是不正确的。如果Stream是一个有限列表,只能识别其值,您只能存储Stream的内容。那时,没有理由在传统的Collection上使用Stream。

答案 1 :(得分:1)

  

或者Stream可能只是一个接口,需要各种集合来实现此接口中指定的这些操作?

多数民众赞成。要正确:集合必须实现必须按照您的解释实施的方法stream

然而Stream接口提供了一些默认方法。一些流提供者做他们自己的存储,例如集合。其他人不需要存储,例如自然数提供者,随机数提供者。

答案 2 :(得分:1)

您可以查看Collection.stream()的来源,看看它是如何处理的。没有什么神奇之处,它只是涉及Stream个对象和Spliterators以及其他相关类的常规Java代码。

Stream也不需要存储对象,因为它们已经存储在创建Collection的{​​{1}}中。非并行流实际上非常简单。