2010-01-28 7 views
14

1 de la presentación dice "¡Estos métodos son PEREZOSOS!"¡La mayoría de los métodos Iteradores e Iterables son LAZY! ¿Qué significa esto?

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>) 

Puede alguien ayudarme a entender lo que quieren decir con esto, digamos que tengo una colección de Persons y aplico un filtro para volver sólo las personas cuyo apellido es DOE.

¿Significa esto que el "filtrado ocurre solo en la primera llamada a doeOnly.next()?"

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

El filtrado debe ocurrir en la primera llamada a 'doeOnly.hasNext()' not 'next()', porque si solo queda un elemento pero falla el predicado, 'hasNext()' debe devolver falso, pero el el filtro no lo sabe hasta que haya obtenido el elemento no coincidente. – finnw

Respuesta

28

Esto significa que los datos se filtran como usted lo solicita - que no pasa por su lista de inmediato, y construir una nueva lista de los datos filtrados. En su lugar, cuando llame al iterator.next() (por ejemplo, automáticamente en un bucle forzado mejorado), el iterador solicitará su fuente de datos en sentido ascendente (su colección) para el siguiente elemento de datos. Luego intentará hacer coincidir esto con el filtro. Si coincide, devolverá ese artículo. De lo contrario, pedirá otro artículo de la colección, y continuará hasta que se quede sin elementos o encuentre una coincidencia.

Luego cuando siguiente pregunta por el siguiente artículo, continuará desde donde lo dejó.

En otras palabras, no sólo significa "filtrado ocurre sólo en la primera llamada a doeOnly.next()" - que significa "filtrado pasa en cada llamada a iterator.next()" donde iterator es el resultado de llamar doeOnly.iterator().

+0

Definiciones útiles: http://en.wikipedia.org/wiki/Lazy_evaluation. –

+0

thx para ambas respuestas ... también google-collect usa evaluación aplicativa o diferida –

+0

entendí la pereza en el filtro y otros métodos a medida que vuelven Iterable ... pero cómo se puede explicar la pereza wrt find y getOnlyElement –

Cuestiones relacionadas