Måder at rykke over en liste i Java

1. Introduktion

Iterering over elementerne på en liste er en af ​​de mest almindelige opgaver i et program.

I denne vejledning vil vi gennemgå forskellige måder at gøre dette på Java. Vi vil fokusere på at gentage listen i rækkefølge, selvom det også er enkelt at gå i omvendt retning.

2. til Sløjfe

Lad os først gennemgå nogle til loop indstillinger.

Lad os begynde med at definere en liste over lande til vores eksempler:

Liste lande = Arrays.asList ("Tyskland", "Panama", "Australien");

2.1. Grundlæggende til Sløjfe

Den mest almindelige flowkontrolerklæring for iteration er grundlæggende til løkke.

Det til loop definerer tre typer udsagn adskilt med semikolon. Den første erklæring er initialiseringserklæringen. Den anden definerer opsigelsesbetingelsen. Den sidste erklæring er opdateringsklausulen.

Her bruger vi simpelthen en heltalsvariabel som et indeks:

for (int i = 0; i <lande.størrelse (); i ++) {System.out.println (lande.get (i)); }

I initialiseringen skal vi erklære en heltalsvariabel for at angive startpunktet. Denne variabel fungerer typisk som listeindekset.

Termineringsbetingelsen er et udtryk, der efter evaluering returnerer en boolsk, når dette udtryk evalueres til falsk løkken er færdig.

Opdateringsklausulen bruges til at ændre den aktuelle tilstand for indeksvariablen, øge den eller formindske den indtil punktet for afslutningen.

2.2. Forbedret til Sløjfe

Den forbedrede til loop er en simpel struktur, der giver os mulighed for at besøge hvert element på en liste. Det svarer til det grundlæggende for loop, men mere læsbart og kompakt. Derfor er det en af ​​de mest almindeligt anvendte former til at krydse en liste.

Bemærk, at den forbedrede til loop er enklere end det grundlæggende til løkke:

for (String land: lande) {System.out.println (land); }

3. Iteratorer

En Iterator er et designmønster, der giver os en standardgrænseflade til at krydse en datastruktur uden at skulle bekymre os om den interne repræsentation.

Denne måde at krydse datastrukturer giver mange fordele, blandt hvilke vi kan understrege, at vores kode ikke afhænger af implementeringen.

Derfor kan strukturen være et binært træ eller en dobbeltkoblet liste siden Iterator abstraherer os fra måden at udføre traversalen på. På denne måde kan vi nemt erstatte datastrukturer i vores kode uden ubehagelige problemer.

3.1. Iterator

I Java er Iterator mønster afspejles i java.util.Iterator klasse. Det er meget brugt i Java Samlinger. Der er to nøglemetoder i en Iterator, det hasNext () og Næste() metoder.

Her demonstrerer vi brugen af ​​begge:

IteratorlandeIterator = lande.iterator (); mens (countryIterator.hasNext ()) {System.out.println (countryIterator.next ()); }

Det hasNext () metode kontrollerer, om der er nogen elementer tilbage på listen.

Det Næste() metode returnerer det næste element i iteration.

3.2. ListIterator

EN ListIterator giver os mulighed for at krydse en liste med elementer i enten fremad eller bagudrettet rækkefølge.

Ruller en liste med ListIterator frem følger en mekanisme svarende til den, der anvendes af Iterator. På denne måde kan vi flytte iteratoren fremad med Næste() metode, og vi kan finde slutningen af ​​listen ved hjælp af hasNext () metode.

Som vi kan se, er ListIterator ligner meget Iterator som vi tidligere brugte:

ListIterator listIterator = country.listIterator (); mens (listIterator.hasNext ()) {System.out.println (listIterator.next ()); }

4. for hver()

4.1. Iterable.forEach ()

Siden Java 8 kan vi bruge for hver() metode til at gentage elementerne på en liste. Denne metode er defineret i Iterabel interface og kan acceptere Lambda-udtryk som en parameter.

Syntaksen er ret enkel:

country.forEach (System.out :: println);

Før for hver funktion, var alle iteratorer i Java aktive, det vil sige, de involverede en i en eller anden periode løkke, der krydsede dataindsamlingen, indtil en bestemt betingelse var opfyldt.

Med introduktionen af for hver som en funktion i Iterabel interface, alle klasser, der implementeres Iterabel har for hver funktion tilføjet.

4.2. Stream.forEach ()

Vi kan også konvertere en samling værdier til en Stream, og vi kan have adgang til operationer som f.eks for hver(), kort(), eller filter().

Her demonstrerer vi en typisk brug for streams:

country.stream (). forEach ((c) -> System.out.println (c));

5. Konklusion

I denne artikel viste vi de forskellige måder at gentage elementerne på en liste ved hjælp af Java API. Blandt disse nævnte vi til løkke, den forbedrede til løkke, den Iterator, det ListIterator og for hver() metode (inkluderet i Java 8).

Derudover viste vi også, hvordan man bruger for hver() metode med Strømme.

Endelig er al den kode, der bruges i denne artikel, tilgængelig i vores Github-repo.