A maioria dos métodos iteradores e iteráveis é preguiçosa! O que isto significa
-
23-09-2019 - |
Pergunta
1 da apresentação diz que "esses métodos são preguiçosos!"
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>)
Alguém pode me ajudar a entender o que eles querem dizer com isso, digamos que eu tenha uma coleção de Persons
e aplico um filtro para devolver apenas as pessoas cujo sobrenome é DOE.
Então, isso significa que "a filtragem acontece apenas na primeira chamada para Doeonly.Next ()?"
List<Person> persons= ....
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE);
Solução
Isso significa que os dados são filtrados conforme você solicita - eles não passam pela sua lista imediatamente e criam uma nova lista dos dados filtrados. Em vez disso, quando você liga iterator.next()
(por exemplo, automaticamente em um loop aprimorado), o iterador solicitará sua fonte de dados upstream (sua coleção) para o próximo item de dados. Em seguida, tentará combinar isso com o filtro. Se corresponder, retornará esse item. Caso contrário, ele solicitará outro item da coleção, mantendo -se até que ela fique sem itens ou encontre uma correspondência.
Então quando você próximo Peça o próximo item, ele continuará indo de onde ele parou.
Em outras palavras, isso não significa apenas "a filtragem acontece apenas na primeira chamada para doeOnly.next()
" - significa" a filtragem acontece em cada ligar para iterator.next()
" Onde iterator
é o resultado de ligar doeOnly.iterator()
.