Java8 的 Stream 到底是什么?

What exactly is Java8's Stream?

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

  1. 如何存储Stream?

  2. Stream怎么能对这么多种类的集合(如数组,链表,map)进行这么多操作?

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

谢谢!

Or maybe Stream is just an interface and all kinds of collections are required to implement these operations specified in this interface?

就是这样。 正确:collection 必须实现一个方法 stream,必须按照您的解释实现。

然而 Stream 接口提供了一些默认方法。一些流媒体提供者自己存储,例如collection秒。其他不需要存储,例如自然数提供者,随机数提供者。

您可以查看 Collection.stream() 的源代码并了解其处理方式。没有魔法,它只是涉及 Stream 对象和 Spliterators 以及其他相关 类.

的常规 Java 代码

Stream 也不需要存储对象,因为它们已经存储在创建 StreamCollection 中。非并行流其实很简单

与 Collection 相比,Stream 的一个重要区别是 Stream 旨在进行延迟评估。摘自 JavaDoc

Streams are lazy; computation on the source data is only performed when the terminal operation is initiated, and source elements are consumed only as needed.

拥有一个 Stream 实例并不能保证该 Stream 的所有元素都是已知的。 Stream 的元素仅在需要时才计算。这反映了 Haskell 或 Scala 等其他函数式语言的特性。您将使用 Stream 为无限列表建模。例如,可以计算斐波那契数列的 Stream。它只会计算所请求的元素。它不会计算所有元素,因为它永远不会完成。

因此,您始终可以存储 Stream 的内容的假设是不正确的。如果 Stream 是一个其值都已确定的有限列表,您将只存储它的内容。在这一点上,几乎没有理由在传统的 Collection 上使用 Stream。