gpt4 book ai didi

Java 8 流与集合存储

转载 作者:IT王子 更新时间:2023-10-28 23:33:47 25 4
gpt4 key购买 nike

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

这句话是我在 an article 上特别读到的。关于 Java 8 中的流。

No storage. Streams don't have storage for values; they carry values from a source (which could be a data structure, a generating function, an I/O channel, etc) through a pipeline of computational steps.

我了解从源中逐个流式传输数据的概念。我不明白的是,如果您从集合中流式传输,怎么没有存储空间?该集合已经存在于堆上,您只是从该集合中流式传输数据,该集合已经存在于“存储”中。

如果我只是用标准的 for 循环遍历集合,那么在内存占用方面有什么区别?

最佳答案

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

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

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();

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

关于Java 8 流与集合存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29787684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com