当前位置: 首页 > 知识库问答 >
问题:

Java8 Stream中的一些有状态的中间操作仍然在懒惰地寻找[复制]

姜嘉良
2023-03-14

在Java 8流API中,对中间(无状态)操作(如filter、map和peek)的描述被称为延迟搜索,这意味着当终端操作需要时,它将逐个元素进行处理。

当终端操作命中时,操作独立地在流中的元素上实现。

但是,当涉及到一些中间(状态)操作时,如ort()、差异()-需要在生成结果之前处理整个输入。

例如,在看到流的所有元素之前,无法对流进行排序,这意味着在终端操作要求之前,不独立地使用所有元素完成操作。

这引发了我一个问题(可能是愚蠢的,也可能是对渴望的懒惰追求的误解),这些“有状态的中间操作”仍然是懒惰追求吗?

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

共有1个答案

朱运诚
2023-03-14

有状态操作可能需要在生成结果之前处理整个输入。例如,在看到流的所有元素之前,无法通过对流进行排序产生任何结果。因此,在并行计算下,一些包含有状态中间操作的管道可能需要多次传递数据,或者可能需要缓冲重要数据。

这就是它所说的意思。一些有状态的操作可能会处理整个输入。如果您向上几段,您将看到以下内容(强调部分已添加):

中间操作返回一个新流。他们总是懒惰;执行中间操作(如filter())实际上并不执行任何过滤,而是创建一个新的流,在遍历时,该流包含与给定谓词匹配的初始流的元素。在执行管道的终端操作之前,不会开始遍历管道源。

所以,是的,它们是懒惰的。如果您在Stream上调用排序并且从不调用终端操作,排序实际上不会在Stream上执行工作。这就是懒惰的意思。但是,一旦在流上调用终端操作,像排序这样的操作将在产生结果之前对整个输入进行操作。这使得此类操作对并行化和短路操作很不利,否则这些操作在产生值之前只能处理一小部分输入。需要明确的是:

  • 在产生值之前,流上的短路操作可能只处理输入的一小部分
  • 流上的延迟操作不会触发在流上执行的工作,直到对所述流调用终端操作为止
  • 中间操作总是懒惰的
 类似资料:
  • 我一直试图理解和展示Java流如何在引擎盖下实现一种类型的循环融合,从而可以将几个操作融合到一个pass中。 这里的第一个例子是: 具有以下输出(对每一个元素的单一传递融合相当清楚): 所以我的问题是,在调用distinct时,我认为因为它是一个“有状态”的中间操作,所以它不允许在(所有操作的)一次传递过程中单独处理单个元素,这是正确的吗。此外,因为sorted()状态操作需要处理整个输入流以产生

  • 问题内容: 我在Linux上编写了一个C程序,该程序可以分配内存,并在一个循环中运行它,而TOP没有显示任何内存消耗。 然后我对该内存做了一些操作,而TOP确实显示了内存消耗。 当我分配内存时,我真的是“获取内存”,还是有一个“惰性”内存管理,仅当使用时才给我内存? (还有一个选项,当我使用它时,TOP只知道内存消耗,因此我不确定。) 谢谢 问题答案: 在Linux上,malloc使用sbrk()

  • 我是新来的反应钩!我正试图在我的代码中使用useState。当我使用它的时候,我发现了一个术语“惰性初始状态” https://reactjs.org/docs/hooks-reference.html 但是我想不出这种惰性状态初始化有什么用处! 就像say am我的DOM正在呈现并且它需要状态值,但是我的useState还没有初始化它!!并且说,如果您已经呈现了DOM,并且Ustate Expe

  • 我还有以下两个类,它们是由我的测试模型生成的: 在DBContext的构造函数中,我显式启用了延迟加载,甚至不需要: 后来我打电话给房子列表: 在标记的断点之后,我预期,由于延迟加载,与房屋相关联的所有人员此时都不会加载。我没有访问一个人,为什么要加载他们?但是它们被加载,因为我的调试器向我显示了所有的name属性。 有人能解释一下这种行为吗?为什么惰性加载不起作用?

  • 问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况

  • 我有一个包含多个< code>LazyRow的< code>LazyColumn。在旧术语中,嵌套RecyclerView。 我的问题是,当移动到一个新的可组合(不同的选项卡)时,不会恢复滚动状态。但是内部s恢复它们的状态。 例如,打开主屏幕,滚动到底部,然后滚动结束,然后打开不同的选项卡并再次返回主选项卡。 的产品进行评级 如何恢复滚动状态?