我一直在阅读Java 8流以及数据从数据源中的流方式,而不是从数据源中提取数据的整个集合。
这是我在文章上特别看到的关于Java8中的流的引用。
没有仓库。流没有值的存储;它们通过计算步骤的管道从源(可以是数据结构、生成函数、I/O通道等)携带值。
我理解源源源源不断地流数据的概念。我不明白的是,如果你是从一个集合流,怎么会没有存储?集合已经存在于堆中,您只是在流来自该集合的数据,集合已经存在于“存储”中。
如果我只是用标准的for循环循环遍历集合,那么内存占用有什么不同呢?
发布于 2015-04-22 17:36:44
关于流和存储的语句意味着流没有自己的任何存储。如果流的源是一个集合,那么很明显,该集合具有保存元素的存储空间。
让我们从那篇文章中拿出一个例子:
int sum = shapes.stream()
.filter(s -> s.getColor() == BLUE)
.mapToInt(s -> s.getWeight())
.sum();假设shapes是一个包含数百万元素的Collection。人们可能会想象,filter操作会迭代源中的元素,并创建一个临时的结果集合,这些结果也可能包含数百万个元素。然后,mapToInt操作可以迭代该临时集合并生成其结果以求求和。
它不是这样工作的。没有临时的中间收藏。流操作是流水线的,因此从filter中产生的元素通过mapToInt和从那里传递到sum,而不被存储到集合中并从集合中读取。
如果流源不是集合--例如,从网络集合中读取元素--则根本不需要任何存储。如下所示的管道:
int sum = streamShapesFromNetwork()
.filter(s -> s.getColor() == BLUE)
.mapToInt(s -> s.getWeight())
.sum();可能会处理数百万个元素,但它不需要在任何地方存储数百万个元素。
发布于 2015-04-22 04:23:35
把水流想象成一个连接到水箱的喷嘴,这是你的数据结构。喷嘴没有自己的储藏室。当然,流提供的水(数据)来自有存储的源,但是流本身没有存储。连接另一个喷嘴(流)到你的坦克(数据结构)将不需要存储一个全新的数据副本。
发布于 2016-01-26 12:50:57
Example1:
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因此,您可以推断的是,收集您可以迭代多少次,您想。但是对于流,一旦你迭代,它就不记得它应该做什么了。所以,你需要再次指示它。
我希望这是明确的。
https://stackoverflow.com/questions/29787684
复制相似问题