Java 8中的Streams和Collections有什么区别

时间:2016-09-11 03:56:10

标签: java collections java-8 java-stream

我正在学习Java 8中的Streams。我对这个概念感到困惑:

  

集合是一种内存数据结构,它包含数据结构当前具有的所有值 - 集合中的每个元素必须先计算才能添加到集合中。相反,流是概念上固定的数据结构,其中元素是按需计算的。

我不明白。 Collection如何才能保存在添加到集合之前必须已计算的值?而且,Stream与固定数据结构的比较是什么意思?

1 个答案:

答案 0 :(得分:44)

您没有提供报价来源,所以让我引用javadoc给您:

  

Streams在几个方面与集合不同:

     
      
  • 无存储空间。流不是存储元素的数据结构;相反,它通过计算操作管道传递来自数据结构,数组,生成器函数或I / O通道等源的元素。
  •   
  • 功能性。对流的操作会产生结果,但不会修改其源。例如,过滤从集合中获取的Stream会生成一个没有过滤元素的新Stream,而不是从源集合中删除元素。
  •   
  • 懒惰寻即可。许多流操作(例如过滤,映射或重复删除)可以懒惰地实现,从而暴露出优化的机会。例如,"找到第一个带有三个连续元音的String"不需要检查所有输入字符串。流操作分为中间(Stream - 生产)操作和终端(产生价值或副作用)操作。中级操作总是很懒惰。
  •   
  • 可能无界。虽然集合的大小有限,但流不需要。诸如limit(n)findFirst()之类的短路操作可以允许无限流上的计算在有限时间内完成。
  •   
  • <强>消耗品即可。流的元素仅在流的生命期间访问过一次。与Iterator类似,必须生成新流以重新访问源的相同元素。
  •   

相比之下,Collection是对象(元素)的容器。除非先前已将对象添加到集合中,否则无法从集合中获取(检索)对象。