21 Stimmen

Die meisten Methoden der Iteratoren und Iterables sind LAZY! Was bedeutet dies

1 der Präsentation sagt: "Diese Methoden sind 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>)

Kann mir jemand helfen, zu verstehen, was damit gemeint ist, sagen wir, ich habe eine Sammlung von Persons und ich wende einen Filter an, um nur die Personen zu finden, deren Nachname DOE ist.

Bedeutet dies also, dass die "Filterung nur beim ersten Aufruf von doeOnly.next() erfolgt?"

List<Person> persons= ....
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE);

35voto

Jon Skeet Punkte 1325502

Das bedeutet, dass die Daten in dem Moment gefiltert werden, in dem Sie sie anfordern - es wird nicht sofort Ihre Liste durchgesehen und eine neue Liste mit den gefilterten Daten erstellt. Stattdessen, wenn Sie iterator.next() (z.B. automatisch in einer erweiterten for-Schleife) fragt der Iterator seine vorgeschaltete Datenquelle (Ihre Sammlung) nach dem nächsten Datenelement. Er versucht dann, dieses mit dem Filter abzugleichen. Wenn es passt, gibt er dieses Element zurück. Andernfalls fragt er nach einem weiteren Element aus der Sammlung und fährt fort, bis er entweder keine Elemente mehr hat oder eine Übereinstimmung findet.

Wenn Sie dann nächste nach dem nächsten Element fragen, wird es dort weitergehen, wo es aufgehört hat.

Mit anderen Worten, es bedeutet nicht nur, dass "die Filterung nur beim ersten Aufruf von doeOnly.next() " - das bedeutet "Filtern geschieht am jede Aufruf an iterator.next() "wo iterator ist das Ergebnis des Aufrufs doeOnly.iterator() .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X