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

时间:2010-01-28 15:50:14

标签: 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);

1 个答案:

答案 0 :(得分:29)

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

然后当你下一个要求下一个项目时,它会继续从它停止的地方开始。

换句话说,它不仅仅意味着“仅在第一次调用doeOnly.next()时才会进行过滤” - 这意味着“在每次调用iterator.next()时都会进行过滤“iterator是调用doeOnly.iterator()的结果。