Большинство методов Iterators и Iterables являются ЛЕНИВЫМИ!Что это значит

StackOverflow https://stackoverflow.com/questions/2155788

Вопрос

В одной из презентаций говорится: «Эти методы ЛЕНИВЫЕ!»

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);
Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top