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

Tea*_* NG 22 java collections java-8 java-stream

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

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

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

And*_*eas 51

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

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

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

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

  • @MarkoTopolnik"Iterator"不是"Collection",所以请不要混淆两者.集合有一个`size()`.---我考虑在构造过程中给出一个元素列表,就像在那时添加它们一样.在成为集合的成员之前存在元素,这是重点.---但是你是对的,它可以实现`Collection`接口而不需要实际的存储支持它,Hibernate就是一个例子.但即使在那里,它实际上是来自*actual*store(数据库)的延迟加载.元素已经存在. (3认同)
  • @Marko Topolnik:Collection API已被改装以允许超过2³¹个元素,在这种情况下,集合必须从`size()`返回`Integer.MAX_VALUE`,但是`HashMap`的当前实现有一个`int`将默默溢出的大小字段,因此它不符合此约定,并且从这样的映射创建的Streams将无法报告正确的`long`大小,因此我不认为它是受支持的用例,而只是缺少错误检测. (3认同)

sub*_*his 5

一些基本的区别是

集合和流的区别

但这些都是一些有限的差异,你必须探索才能了解更多。收藏就像 CD/DVD,流媒体就像电影。流可以是无状态的和有状态的。