21

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

1 回答 1

34

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

然后,当您下一次要求下一个项目时,它会从上次中断的地方继续。

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

于 2010-01-28T15:52:28.660 回答