Большинство методов Iterators и Iterables LAZY! Что это значит

1 презентации гласит: "Эти методы LAZY!"

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

Это означает, что данные отфильтровываются по мере запроса - он не проходит через ваш список немедленно и создает новый список отфильтрованных данных. Вместо этого, когда вы вызываете iterator.next() (например, автоматически в расширенном цикле), итератор будет запрашивать у него исходный источник данных (вашу коллекцию) для следующего элемента данных. Затем он попытается сопоставить это с фильтром. Если он соответствует ему, он вернет этот элемент. В противном случае, он попросит еще один элемент из коллекции, продолжая идти, пока он не закончится или не найдет совпадение.

Затем, когда вы в следующий раз спросите о следующем элементе, он будет продолжать движение с того места, где он остановился.

Другими словами, это означает, что "фильтрация происходит только при первом вызове doeOnly.next()" - это означает, что "фильтрация происходит при каждом вызове iterator.next()", где iterator является результатом вызова doeOnly.iterator().