2010-01-28 10 views
14

1 der Präsentation sagt "Diese Methoden sind LETZHAFT!"Die meisten Iteratoren und Iterables-Methoden sind LETZHAFT! Was bedeutet das?

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 sie damit meinen, sagen wir mal ich eine Sammlung von Persons habe und ich anwenden ein Filter nur die Personen, deren Nachname zurückzukehren DOE.

Also bedeutet dies, dass die "Filterung passiert nur beim ersten Aufruf von doeOnly.next()?"

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

Die Filterung muss beim ersten Aufruf von 'doeOnly.hasNext()' not 'next()' erfolgen, denn wenn nur ein Element übrig ist, aber das Prädikat fehlschlägt, muss 'hasNext()' false zurückgeben, aber der Das weiß der Filter erst, wenn er das nicht übereinstimmende Element abgerufen hat. – finnw

Antwort

28

Es bedeutet, dass die Daten gefiltert werden, wie Sie es wünschen - es durch die Liste geht nicht sofort, und baut eine neue Liste der gefilterten Daten auf. Wenn Sie iterator.next() aufrufen (z. B. automatisch in einer erweiterten for-Schleife), fragt der Iterator stattdessen seine Upstream-Datenquelle (Ihre Sammlung) nach dem nächsten Datenelement ab. Es wird dann versuchen, dies mit dem Filter abzugleichen. Wenn es übereinstimmt, wird das Objekt zurückgegeben. Andernfalls wird nach einem anderen Objekt aus der Sammlung gefragt, das weiterläuft, bis entweder keine Elemente mehr vorhanden sind oder eine Übereinstimmung gefunden wird.

Dann, wenn Sie nächste für das nächste Element fragen, wird es weitermachen von wo es aufgehört hat.

Mit anderen Worten, es bedeutet nicht nur „Filterung geschieht nur auf dem ersten Aufruf von doeOnly.next()“ - es bedeutet „Filterung geschieht auf jeden Aufruf iterator.next()“, wo iterator das Ergebnis des Aufrufs doeOnly.iterator() ist.

+0

Hilfreiche Definitionen: http://en.wikipedia.org/wiki/Lazy_evaluation. –

+0

thx für beide die Antworten ... auch verwendet google-collect applicative oder verzögerte Auswertung –

+0

ich verstand die Faulheit in Filter und anderen Methoden, wie sie Iterable zurückgeben ... aber wie kann die Faulheit wrt zu finden sein und getOnlyElement –