大多数迭代器和可迭代对象方法都是“惰性”的!这是什么意思?

21

演示文稿中的第一部分说:“这些方法是懒惰的!”

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

过滤必须在第一次调用 doeOnly.hasNext() 而不是 next() 上进行,因为如果只剩下一个元素但它未通过谓词,则 hasNext() 必须返回 false,但是过滤器在获取非匹配元素之前不知道这一点。 - finnw
1个回答

35
这意味着数据按您的请求进行过滤-它不会立即通过您的列表并建立一个新的已过滤数据列表。相反,当您调用iterator.next()(例如在增强的for循环中自动调用)时,迭代器将向其上游数据源(您的集合)请求下一个数据项。然后,它将尝试将其与过滤器匹配。如果匹配,则返回该项。否则,它将继续从集合中请求另一项,直到耗尽所有项或找到匹配项为止。
然后,当您要求下一个项目时,它将从上次停止的位置继续遍历。
换句话说,这不仅意味着“筛选仅在第一次调用doeOnly.next()时发生”-它意味着“每次调用iterator.next()(其中iterator是调用doeOnly.iterator() 的结果)都会进行筛选”。

谢谢两位的回复……另外,Google Collect使用的是应用程序评估还是延迟评估? - Aravind Yarram
我理解 filter 和其他方法中的惰性,因为它们返回 Iterable...但是如何解释与 find 和 getOnlyElement 相关的惰性呢? - Aravind Yarram
@Pangea:我怀疑这些不应该被记录为“懒惰的”。 - Jon Skeet
5
但是这些方法确实很“懒惰”!它们直到必须要做某事时才开始工作。只是恰巧它们需要立刻开始工作。 :) - Kevin Bourrillion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接