Sprievodca Iterátorom v Jave

1. Úvod

An Iterátor je jedným z mnohých spôsobov, ako môžeme prechádzať zbierkou, a ako každá možnosť, má svoje klady a zápory.

Prvýkrát bol predstavený v prostredí Java 1.2 ako náhrada za Vyčíslenia a:

  • predstavil vylepšené názvy metód
  • umožnilo odstrániť prvky zo zbierky, ktorú iterujeme
  • nezaručuje iteračnú objednávku

V tomto tutoriáli sa chystáme preskúmať jednoduché Iterátor rozhranie, aby sme sa naučili, ako môžeme využiť jeho rôzne metódy.

Skontrolujeme tiež robustnejšie ListIterator rozšírenie, ktoré pridáva zaujímavé funkcie.

2. The Iterátor Rozhranie

Najprv musíme získať Iterátor od a Zbierka; to sa deje zavolaním na iterátor () metóda.

Pre jednoduchosť získame Iterátor inštancia zo zoznamu:

Zoznam položiek = ... Iterátor iter = items.iterator ();

The Iterátor rozhranie má tri základné metódy:

2.1. hasNext ()

The hasNext () metódu je možné použiť na kontrolu, či zostáva aspoň jeden prvok na iteráciu.

Je navrhnutý na použitie ako podmienka v zatiaľ čo slučky:

while (iter.hasNext ()) {// ...}

2.2. Ďalšie()

The Ďalšie() metódu je možné použiť na prekonanie nasledujúceho prvku a jeho získanie:

Reťazec next = iter.next ();

Je dobrým zvykom používať hasNext () pred pokusom o volanie Ďalšie().

Iterátory pre Zbierky nezaručujte iteráciu v konkrétnom poradí, pokiaľ to neposkytuje konkrétna implementácia.

2.3. odstrániť ()

Nakoniec, ak chceme odstrániť aktuálny prvok zo zbierky, môžeme použiť odstrániť:

iter.remove ();

Toto je bezpečný spôsob odstránenia prvkov pri iterácii kolekcie bez rizika a ConcurrentModificationException.

2.4. Plná Iterátor Príklad

Teraz ich môžeme všetky skombinovať a pozrieť sa na to, ako spolu používame tieto tri metódy filtrovania zbierok:

while (iter.hasNext ()) {Reťazec ďalší = iter.next (); System.out.println (ďalší); if ("TWO" .equals (next)) {iter.remove (); }}

Takto bežne používame Iterátor, vopred skontrolujeme, či existuje ďalší prvok, načítame ho a potom s ním vykonáme nejakú akciu.

2.5. Iterácia s výrazmi lambda

Ako sme videli v predchádzajúcich príkladoch, použitie „ Iterátor keď chceme len prejsť všetky prvky a niečo s nimi urobiť.

Od verzie Java 8 máme forEachRemaining metóda, ktorá umožňuje použitie lambdas na spracovanie zostávajúcich prvkov:

iter.forEachRemaining (System.out :: println);

3. The ListIterator Rozhranie

ListIterator je rozšírenie, ktoré pridáva nové funkcie pre iteráciu nad zoznamami:

ListIterator listIterator = items.listIterator (items.size ());

Všimnite si, ako môžeme poskytnúť východiskovú pozíciu, ktorá je v tomto prípade koniec Zoznam.

3.1. hasPrevious () a predchádzajúca ()

ListIterator možno použiť na spätný prechod, takže poskytuje ekvivalenty hasNext () a Ďalšie():

while (listIterator.hasPrevious ()) {Reťazec predchádzajúci = listIterator.previous (); }

3.2. nextIndex () a previousIndex ()

Ďalej môžeme prechádzať indexy a nie skutočné prvky:

Reťazec nextWithIndex = items.get (listIterator.nextIndex ()); Reťazec previousWithIndex = items.get (listIterator.previousIndex ());

To by sa mohlo ukázať ako veľmi užitočné v prípade, že potrebujeme poznať indexy objektov, ktoré práve upravujeme, alebo ak chceme viesť záznam o odstránených prvkoch.

3.3. pridať ()

The pridať metóda, ktorá, ako už názov napovedá, nám umožňuje pridať prvok pred položkou, ktorá by bola vrátená používateľom Ďalšie() a potom, čo sa ten vrátil predošlé ():

listIterator.add ("ŠTYRI");

3.4. sada ()

Posledná metóda, ktorá stojí za zmienku, je sada (), čo nám umožňuje nahradiť prvok, ktorý bol vrátený vo výzve Ďalšie() alebo predchádzajúca ():

Reťazec next = listIterator.next (); if ("ONE" .equals (next)) {listIterator.set ("SWAPPED"); }

Je dôležité si to uvedomiť toto je možné vykonať iba v prípade, že na server nie sú vopred volané pridať () alebo odstrániť () boli vyrobené.

3.5. Plná ListIterator Príklad

Teraz ich môžeme spojiť všetky a vytvoriť tak úplný príklad:

ListIterator listIterator = items.listIterator (); while (listIterator.hasNext ()) {String nextWithIndex = items.get (listIterator.nextIndex ()); Reťazec next = listIterator.next (); if ("REPLACE ME" .equals (next)) {listIterator.set ("REPLACED"); }} listIterator.add ("NOVÉ"); while (listIterator.hasPrevious ()) {Reťazec previousWithIndex = items.get (listIterator.previousIndex ()); Reťazec previous = listIterator.previous (); System.out.println (predchádzajúci); }

V tomto príklade začneme získaním ListIterator z Zoznam, potom môžeme získať nasledujúci prvok buď indexom -čo nezvyšuje vnútorný prúdový prvok iterátora - alebo zavolaním Ďalšie.

Potom môžeme konkrétnu položku nahradiť nastaviť a vložte nový pomocou pridať.

Po dosiahnutí konca iterácie sa môžeme vrátiť späť a upraviť ďalšie prvky alebo ich jednoducho vytlačiť zdola nahor.

4. Záver

The Iterátor rozhranie nám umožňuje upravovať kolekciu pri jej prechádzaní, čo je náročnejšie pri jednoduchom príkaze for / while. To nám zase dáva dobrý vzor, ​​ktorý môžeme použiť v mnohých metódach, ktoré si vyžadujú iba spracovanie zbierok pri zachovaní dobrej súdržnosti a nízkej väzby.

Nakoniec je ako vždy celý zdrojový kód k dispozícii na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found