大多数迭代器和迭代器方法都是懒惰的!这是什么意思

2022-09-02 03:33:33

演示文稿的 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>)

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

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

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

答案 1

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

然后,当您下次要求下一个项目时,它将从它离开的地方继续前进。

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


答案 2