Java8中流和集合之间的区别是什么

Java8中流和集合之间的区别是什么,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我正在学习Java8中的流。我对这个概念感到困惑: 集合是内存中的数据结构,它保存数据结构当前具有的所有值。在将集合中的每个元素添加到集合中之前,必须计算集合中的每个元素。相反,流是一种概念上固定的数据结构,其中的元素是按需计算的 我不明白集合如何只能保存在添加到集合之前必须计算的值?另外,将流与固定数据结构进行比较意味着什么?您没有提供报价的来源,因此让我向您引用以下内容: 流在几个方面与集合不同: 无存储。流不是存储元素的数据结构;相反,它通过计算操作管道从数据结构、数组、生成器函数或I/

我正在学习Java8中的流。我对这个概念感到困惑:

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


我不明白集合如何只能保存在添加到集合之前必须计算的值?另外,将流与固定数据结构进行比较意味着什么?

您没有提供报价的来源,因此让我向您引用以下内容:

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

  • 无存储。流不是存储元素的数据结构;相反,它通过计算操作管道从数据结构、数组、生成器函数或I/O通道等源传输元素
  • 本质上是功能性的。流上的操作生成结果,但不修改其源。例如,过滤从集合中获得的
    会生成一个新的
    ,而不包含过滤后的元素,而不是从源集合中删除元素
  • 寻求懒惰。许多流操作(如筛选、映射或重复删除)都可以延迟实现,从而提供了优化的机会。例如,“查找具有三个连续元音的第一个
    字符串
    ”不需要检查所有输入字符串。流操作分为中间(
    产生)操作和终端(产生价值或副作用)操作。中间操作总是懒惰的
  • 可能是无界的。虽然集合的大小有限,但流不需要。短路操作,如
    limit(n)
    findFirst()
    可以允许在有限时间内完成无限流上的计算
  • 耗材。在流的生命周期中,流的元素只访问一次。与
    迭代器一样,必须生成一个新流来重新访问源代码的相同元素

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

不清楚您在问什么。关于“在添加之前计算”您不了解什么?还是“概念上固定的数据结构”?根据你的问题,也不清楚你是在问这些术语的含义,还是在问collections和streams之间的区别,根据你的标题,这更无关紧要。两者的目的不同。从根本上说,集合的目标是管理其元素,如添加、删除、在特定索引处添加等。。。流的目标是处理这样的元素,如查找与条件匹配的任何元素、根据条件筛选元素等。引用自“4.3.流与集合”。
除非对象先前添加到集合中,否则无法从集合中获取(检索)对象。
这不是真的,没有这样的合同。集合可以非空开始其生命周期;它也可能是惰性的,只有在您请求时才实现元素(例如,Hibernate的惰性集合)。即使是有限大小也是一个有问题的属性,因为迭代器可以返回无限数量的元素。@MarkoTopolnik一个
迭代器
不是
集合,所以请不要混淆两者。集合有一个
大小()我认为在构建过程中给出元素列表与在那时添加元素是一样的。元素在成为集合的成员之前存在,这就是点。--但是您是对的,可以实现
集合
接口,而不需要实际的存储支持,Hibernate就是一个例子。但即使在那里,从技术上讲,它也是从实际存储(数据库)延迟加载的。元素已经存在。集合的契约要求使用迭代器,所以我不会混淆任何东西。集合确实有一个
size()
,这就是为什么我说它“有问题”——例如,
Map
也有大小,但是
HashMap
中可以有2^31个以上的元素。将元素描述为“实际存在”是哲学的。也可以在实现时计算,例如通过掷骰子。@Marko Topolnik:Collection API经过改装,允许2个以上的元素,在这种情况下,集合必须从
size()
返回
Integer.MAX\u值
,但是,当前的<代码> HashMap < /代码>有一个<代码> int <代码>大小字段,它将悄悄地溢出,所以它不遵守这个约定,并且从这样的映射创建的流将不能报告正确的<代码>长< /COD>大小,所以我不认为它是一个支持的用例。但只是缺少一个错误检测。@holger是的,
Collection
Map
都指定了这个
Integer.MAX_值
逻辑。随着Java堆的增长,
HashMap
的不遵从性将成为一个更加紧迫的问题。