首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8流与集合存储

Java 8流与集合存储
EN

Stack Overflow用户
提问于 2015-04-22 04:18:32
回答 5查看 11.8K关注 0票数 18

我一直在阅读Java 8流以及数据从数据源中的流方式,而不是从数据源中提取数据的整个集合。

这是我在文章上特别看到的关于Java8中的流的引用。

没有仓库。流没有值的存储;它们通过计算步骤的管道从源(可以是数据结构、生成函数、I/O通道等)携带值。

我理解源源源源不断地流数据的概念。我不明白的是,如果你是从一个集合流,怎么会没有存储?集合已经存在于堆中,您只是在流来自该集合的数据,集合已经存在于“存储”中。

如果我只是用标准的for循环循环遍历集合,那么内存占用有什么不同呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-22 17:36:44

关于流和存储的语句意味着流没有自己的任何存储。如果流的源是一个集合,那么很明显,该集合具有保存元素的存储空间。

让我们从那篇文章中拿出一个例子:

代码语言:javascript
复制
int sum = shapes.stream()
                .filter(s -> s.getColor() == BLUE)
                .mapToInt(s -> s.getWeight())
                .sum();

假设shapes是一个包含数百万元素的Collection。人们可能会想象,filter操作会迭代源中的元素,并创建一个临时的结果集合,这些结果也可能包含数百万个元素。然后,mapToInt操作可以迭代该临时集合并生成其结果以求求和。

它不是这样工作的。没有临时的中间收藏。流操作是流水线的,因此从filter中产生的元素通过mapToInt和从那里传递到sum,而不被存储到集合中并从集合中读取。

如果流源不是集合--例如,从网络集合中读取元素--则根本不需要任何存储。如下所示的管道:

代码语言:javascript
复制
int sum = streamShapesFromNetwork()
                .filter(s -> s.getColor() == BLUE)
                .mapToInt(s -> s.getWeight())
                .sum();

可能会处理数百万个元素,但它不需要在任何地方存储数百万个元素。

票数 37
EN

Stack Overflow用户

发布于 2015-04-22 04:23:35

把水流想象成一个连接到水箱的喷嘴,这是你的数据结构。喷嘴没有自己的储藏室。当然,流提供的水(数据)来自有存储的源,但是流本身没有存储。连接另一个喷嘴(流)到你的坦克(数据结构)将不需要存储一个全新的数据副本。

票数 7
EN

Stack Overflow用户

发布于 2016-01-26 12:50:57

  1. Collection是一种数据结构。根据这个问题,您可以决定使用哪个集合,比如ArrayList、LinekedList (考虑时间和空间复杂性)。因为只是一种处理工具,它使您的生活更加轻松。
  2. 另一个不同之处是,您可以将Collection视为内存中的数据结构,您可以在其中添加、删除元素。就像在中一样,您可以执行两种操作: a. 中间操作:结果集的筛选、映射、排序、限制 b. 终端操作:forEach,将结果集收集到集合中。 但是如果您注意到,对于流,您不能添加或删除元素。
  3. stream 是一种迭代器,您可以通过流遍历集合。注意,您只能遍历流一次,让我举一个例子来更好地理解:

Example1:

代码语言:javascript
复制
List<String> employeeNameList = Arrays.asList("John","Peter","Sachin");
    Stream<String> s = employeeNameList.stream();

    // iterate through list
    s.forEach(System.out :: println);  // this work's perfectly fine
    s.forEach(System.out :: println);  // you will get IllegalStateException, stating stream already operated upon

因此,您可以推断的是,收集您可以迭代多少次,您想。但是对于流,一旦你迭代,它就不记得它应该做什么了。所以,你需要再次指示它。

我希望这是明确的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29787684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档