This question already has answers here:
Stream and lazy evaluation
(4个答案)
2个月前关闭。
在Java 8 Stream API中,将诸如filter,map和peek之类的中间(无状态)操作的描述称为“惰性搜索”,这意味着在需要Terminal操作时它将逐个元素地处理。
当终端操作命中时,操作在流中的元素上独立实现。
但是当涉及到诸如sort(),distinct()之类的一些中间(有状态)操作时,需要在产生结果之前处理整个输入。
例如,在查看完流的所有元素之前,无法对流进行排序会产生任何结果-意味着在终端操作需要之前,并非所有元素都独立完成操作。
这触发了我一个问题(这些问题可能是愚蠢的,或者是与Eager一起误解了懒惰的追求),而这些“有状态的中间行动”仍然是懒惰的追求吗?
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
(4个答案)
2个月前关闭。
在Java 8 Stream API中,将诸如filter,map和peek之类的中间(无状态)操作的描述称为“惰性搜索”,这意味着在需要Terminal操作时它将逐个元素地处理。
当终端操作命中时,操作在流中的元素上独立实现。
但是当涉及到诸如sort(),distinct()之类的一些中间(有状态)操作时,需要在产生结果之前处理整个输入。
例如,在查看完流的所有元素之前,无法对流进行排序会产生任何结果-意味着在终端操作需要之前,并非所有元素都独立完成操作。
这触发了我一个问题(这些问题可能是愚蠢的,或者是与Eager一起误解了懒惰的追求),而这些“有状态的中间行动”仍然是懒惰的追求吗?
https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
最佳答案
有状态操作可能需要在产生结果之前处理整个输入。例如,在查看流的所有元素之前,不能对流进行排序产生任何结果。结果,在并行计算下,某些包含有状态中间操作的管道可能需要对数据进行多次遍历,或者可能需要缓冲大量数据。
这就是说的意思。一些有状态操作可能会处理整个输入。如果上几段,您将看到以下内容(添加了重点):
中间操作返回一个新的流。他们总是很懒惰。执行诸如filter()之类的中间操作实际上不会执行任何过滤,而是创建一个新的流,该新流在遍历时将包含与给定谓词匹配的初始流的元素。在执行管道的终端操作之前,不会开始遍历管道源。
所以,是的,他们很懒。如果您在Stream上调用sort
而从不调用终端操作,则sort
实际上不会在Stream上运行。那就是懒惰的意思。但是,一旦在流上调用了终端操作,则sort
之类的操作将在产生结果之前对整个输入进行操作。这使得此类操作很讨厌并行化和短路操作,否则这些操作可能无法实现
在产生值之前仅处理输入的一小部分。要清楚:
在产生值之前,Stream上的短路操作可能只处理一部分输入。
对Stream的惰性操作不会触发要在该Stream上完成的工作,直到在该Stream上调用了终端操作为止。
中间操作总是很懒。
关于java - Java 8 Stream中的某些有状态中间操作仍在懒惰地寻求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58383060/