java - 大多数 Iterators 和 Iterables 方法都是 LAZY!这是什么意思

标签 java collections iterator guava

1 个演示文稿说“这些方法很懒惰!”

Iterable transform(Iterable, Function)*
Iterable filter(Iterable, Predicate)*
T find(Iterable<T>, Predicate)
Iterable concat(Iterable<Iterable>)
Iterable cycle(Iterable)
T getOnlyElement(Iterable<T>)
Iterable<T> reverse(List<T>)

谁能帮我理解他们的意思,假设我有一个 Persons 的集合,我应用了一个过滤器以仅返回姓氏为 DOE 的人。

那么这是否意味着“过滤仅在第一次调用 doeOnly.next() 时发生?”

List<Person> persons= ....
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE);

最佳答案

这意味着数据会根据您的请求进行过滤 - 它不会立即通过您的列表,而是建立一个新的过滤数据列表。相反,当您调用 iterator.next() 时(例如,在增强的 for 循环中自动调用),迭代器将向其上游数据源(您的集合)询问下一个数据项。然后它将尝试将其与过滤器进行匹配。如果匹配,它将返回该项目。否则,它会从集合中请求另一个项目,一直持续到它用完项目或找到匹配项。

然后,当您next 请求下一项时,它会从停止的地方继续。

换句话说,它不仅仅意味着“过滤仅在第一次调用 doeOnly.next() 时发生”——它意味着“过滤发生在每个调用 iterator.next()",其中 iterator 是调用 doeOnly.iterator() 的结果。

关于java - 大多数 Iterators 和 Iterables 方法都是 LAZY!这是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155788/

相关文章:

java - 支持/整合语言测量单位的策略是什么?

java - 澄清新的JVM内存参数InitialRAMPercentage和MinRAMPercentage的含义

java - 请求 header 中存在多个 JSESSIONID

swift - 在 Swift 中获取字符串的第 n 个字符

java - 将两个集合(有重复项)合并为一个集合(无重复项)

c++ - multimap::erase() 标准行为?

java - FTSearch(Domino API) 能否查找特定小时或分钟内发送的邮件

java - 对对象集合进行排序的有效方法

c++ - C++ STL 数组的迭代器大小

java - java中迭代器的使用