Maneiras de Iterar Sobre uma Lista em Java
1. Introdução
A iteração sobre os elementos de uma lista é uma das tarefas mais comuns em um programa.
Neste tutorial, vamos revisar diferentes maneiras de fazer isso em Java. Estaremos nos concentrando em iterar pela lista em ordem, embora fazerin reverse também seja simples.
2. for Loop
Em primeiro lugar, vamos revisar algumas opções defor loop.
Vamos começar definindo uma lista de países para nossos exemplos:
List countries = Arrays.asList("Germany", "Panama", "Australia");
2.1. Loopfor básico
A instrução de controle de fluxo mais comum para iteração é o loopfor básico.
O loopfor define três tipos de instruções separadas por ponto-e-vírgula. A primeira instrução é a instrução de inicialização. O segundo define a condição de terminação. A última declaração é a cláusula de atualização.
Aqui, estamos simplesmente usando uma variável inteira como um índice:
for (int i = 0; i < countries.size(); i++) {
System.out.println(countries.get(i));
}
Na inicialização, devemos declarar uma variável inteira para especificar o ponto inicial. Essa variável geralmente atua como o índice da lista.
A condição de término é uma expressão que, após a avaliação, retorna um booleano, assim que essa expressão for avaliada comofalse quando o loop terminar.
A cláusula de atualização é usada para modificar o estado atual da variável de índice, aumentando ou diminuindo até o ponto de término.
2.2. Loopfor aprimorado
O loopfor aprimorado é uma estrutura simples que nos permite visitar cada elemento de uma lista. É semelhante ao básico para loop, mas mais legível e compacto. Consequentemente, é uma das formas mais usadas para percorrer uma lista.
Observe que o loopfor aprimorado é mais simples do que o loopfor básico:
for (String country : countries) {
System.out.println(country);
}
3. Iteradores
UmIterator é um padrão de design que nos oferece uma interface padrão para percorrer uma estrutura de dados sem ter que nos preocupar com a representação interna.
Essa maneira de percorrer estruturas de dados oferece muitas vantagens, entre as quais podemos enfatizar que nosso código não depende da implementação.
Portanto, a estrutura pode ser uma árvore binária ou uma lista duplamente vinculada, uma vez que oIterator nos abstrai da forma de realizar o percurso. Dessa forma, podemos facilmente substituir estruturas de dados em nosso código sem problemas desagradáveis.
3.1. Iterator
Em Java, o padrãoIterator é refletido na classejava.util.Iterator. É amplamente usado em JavaCollections. Existem dois métodos principais em umIterator, os métodoshasNext()enext().
Aqui, demonstramos o uso de ambos:
Iterator countriesIterator = countries.iterator();
while(countriesIterator.hasNext()) {
System.out.println(countriesIterator.next());
}
O métodohasNext()checks if there are any elements remaining in the list.
O métodonext()returns the next element in the iteration.
3.2. ListIterator
UmListIterator nos permite percorrer uma lista de elementos na ordem para frente ou para trás.
Rolar uma lista comListIterator para frente segue um mecanismo semelhante ao usado porIterator. Dessa forma, podemos mover o iterador para frente com o métodonext(), e podemos encontrar o final da lista usando o métodohasNext().
Como podemos ver, oListIterator é muito semelhante aoIterator que usamos anteriormente:
ListIterator listIterator = countries.listIterator();
while(listIterator.hasNext()) {
System.out.println(listIterator.next());
}
4. forEach()
4.1. Iterable.forEach()
Since Java 8, we can use the forEach() method to iterate over the elements of a list. Este método é definido na interfaceIterable e pode aceitar expressões Lambda como parâmetro.
A sintaxe é bem simples:
countries.forEach(System.out::println);
Antes da funçãoforEach, todos os iteradores em Java estavam ativos, ou seja, eles envolviam um loop for ou while que percorria a coleta de dados até que uma determinada condição fosse atendida.
Com a introdução deforEach como uma função na interfaceIterable, todas as classes que implementamIterable têm a funçãoforEach adicionada.
4.2. Stream.forEach()
Também podemos converter uma coleção de valores em um fluxo e podemos ter acesso a operações comoforEach(),map(), oufilter().
Aqui, demonstramos um uso típico para fluxos:
countries.stream().forEach((c) -> System.out.println(c));
5. Conclusão
Neste artigo, mostramos as diferentes maneiras de iterar sobre os elementos de uma lista usando a API Java. Entre eles, mencionamos o loopfor, o sloopfor aprimorado, oIterator, oListIteratore o métodoforEach() (incluído no Java 8).
Além disso, também mostramos como usar o métodoforEach() comStreams.
Finalmente, todo o código usado neste artigo está disponível em nossoGithub repo.