Большинство методов Iterators и Iterables являются LAZY! Что это значит - PullRequest
15 голосов
/ 28 января 2010

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 Ответ

29 голосов
/ 28 января 2010

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

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

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

...