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/