Ciclu îmbunătățit

Este prezentat ca o nouă funcție de limbă în J2SE 5.0, îmbunătățite pentru bucla vă permite să itera prin colectarea, fără a fi nevoie de a crea un iterator, sau fără a fi nevoie să calculeze început și de sfârșit condițiile pentru variabila contor. Buclă îmbunătățită este cea mai ușoară dintre noile caracteristici care trebuie incluse imediat în codul dvs. În acest sfat, veți vedea cum o bucla îmbunătățită înlocuiește modalitățile tradiționale de acces secvențial la elementele din colecție.







Deci ce arată bucla îmbunătățită? Să presupunem că aveți un set de obiecte TechTip numite RecentTips. Puteți utiliza bucla îmbunătățită cu colecția după cum urmează:

Ați citit acest text ca fiind "pentru fiecare TechTip în RecentTips". Aici, feedback-ul variabil este folosit pentru a indica actuala instanță TechTip din colecție. Din cauza formulării "pentru fiecare", în schimbul unei extinderi de construire, se face referire, de asemenea, la schimbul pentru fiecare proiect.

Dacă comparați ciclul îmbunătățit cu o metodă tipică de iterație pentru colectare, a devenit clar că pentru fiecare ciclu este simplu și poate face codul mai ușor de citit.

De asemenea, rețineți că ciclul îmbunătățit este conceput pentru a simplifica munca cu medicamente generice. Deși acest sfat include două exemple de utilizare a unui ciclu îmbunătățit cu medicamente generice, acesta nu este punctul central al vârfului. În schimb, scopul acestui indiciu este să vă familiarizați cu schimbările de bază pe care le puteți face în codul dvs. de utilizat pentru fiecare ciclu.

Mai întâi, luați în considerare modul în care puteți utiliza o buclă pentru a enumera elementele unui tablou. Pentru simplitate, încărcați o matrice cu șase inți, care reprezintă pătratele Ints de la zero la cinci. Iată buclă care repetă:

Linia ilustrează utilizarea clasică pentru ciclu. Acesta determină valoarea inițială a unuia sau mai multor contoare, creează o condiție de terminare și descrie modul în care contoarele pot fi incrementate.

Iată un program scurt, OldForArray, care utilizează o buclă.


clasa publica OldForArray

Compilați și executați programul OldForArray și veți obține următoarele:

Dacă modificați programul de testare pentru a utiliza o buclă îmbunătățită, puteți specifica valorile corespunzătoare și colecția care provine de la variabile. Iată liniile care reprezintă o buclă îmbunătățită:

Puteți citi această linie ca "iterând peste elementele din colecție pentru a le pătrate." Elementul actual se va referi la Int I. "

Nu este nevoie să determinați câte elemente sunt în matrice înainte de buclă. Nu este, de asemenea, necesar să specificați modul de creștere a poziției curente. "Sub pătură", o buclă îmbunătățită pentru o matrice este echivalentă cu o bucla prezentată mai devreme.

Programul de testare NewForArray dă același rezultat, OldForArray.


clasa publica NewForArray

Apoi puteți utiliza lista.get (I) pentru a face referire la elementul curent. De exemplu, următorul program, OldForArrayList, utilizează autoboxing pentru a popula ArrayList și apoi citește din ArrayList:








import java.util.ArrayList;
import java.util.List;

clasa publică OldForArrayList <
static privat Pătrari în listă = nou ArrayList ();

privat staticvoid outputList () <
pentru (int i = 0; i System.out.printf ("Squared este .. \ n".
i, squares.get (i));
>
>

public staticvoid main (String args []) <
fillList ();
outputList ();
>
>

Cu toate acestea, deoarece ArrayList face parte din colecție, este mai frecventă repetarea folosind iteratorul în următoarea ordine:


în timp ce (iterator.hasNext ()) <
doSomethingWith (iterator.next ());
>

Puteți lega în această buclă, așa cum se arată în următorul program, IteratorForArrayList:


import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

clasa publică IteratorForArrayList

static privat Pătrari în listă = nou ArrayList ();

privat staticvoid outputList () <
Iteratorul iterator = squares.iterator ();
int j = 0;
pentru (; iterator.hasNext ();) <
System.out.printf ("Squared este .. \ n".
j ++, iterator.next ());
>
>

public staticvoid main (String args []) <
fillList ();
outputList ();
>
>

Se pare oarecum neobișnuit să ai o buclă, nu primul sau al treilea parametru. Nu există o stare inițială, iar poziția incrementală din listă este executată în bucla corpului cu apelul iterator.next ().

O buclă îmbunătățită face ca utilizarea iteratorului să nu fie necesară în mod explicit. În loc să creați un iterator pentru ArrayList și apoi să utilizați iteratorul în buclă, puteți utiliza următoarele:

Aceasta indică faptul că numele colecției de pătrate. De asemenea, indică faptul că elementul curent referit este de tip Integer și este referit de variabila de zonă.

Acest cod nu se va compila, deoarece nu există nici o cale să știm că conținutul lui ArrayList este de tip Integer. Pentru a repara acest lucru, trebuie să utilizați o altă funcție introdusă în J2SE 5.0, și anume generice. Trebuie să specificați în declarație și în definiția zonei că aceasta poate conține numai elemente de tip Integer. Puteți face acest lucru după cum urmează:

Următorul program, NewArrayList, arată cum se utilizează ciclul îmbunătățit împreună cu medicamentele generice


import java.util.List;
import java.util.ArrayList;

clasa publica NewArrayList <
listă statică privată pătrate
= noul ArrayList ();

privat staticvoid outputList () <
int j = 0;
pentru (pătrate întregi pătrate) <
System.out.printf ("Squared este .. \ n".
j ++, pătrat);
>
>

public staticvoid main (String args []) <
fillList ();
outputList ();
>
>


void cancelAll (Colecția c) <
pentru (Iterator i = c.iterator (); i.hasNext ();) <
TimerTask tt = (TimerTask) i.next ();
tt.cancel ();
>
>

Apoi, este introdusă o buclă îmbunătățită pentru a evita utilizarea iteratorului:


void cancelAll (Colecția c) <
pentru (Obiect o.c)
((TimerTask) o). anulați ();
>

Există, de asemenea, un obiect de tratare a elementelor dintr-o colecție ca tip de obiect și apoi de a le conduce la tipul TimerTask. Acest lucru este corectat prin introducerea produselor generice după cum urmează:


void cancelAll (Colecția c) <
pentru (sarcina TimerTask, c)
task.cancel ();
>

Este important de observat că un ciclu îmbunătățit nu poate fi folosit în întreaga lume. Nu puteți utiliza buclele îmbunătățite:

  • Pentru a elimina obiectele în timp ce traversați colecțiile
  • Pentru a modifica slotul curent într-o matrice sau o listă
  • Pentru a repeta mai multe colecții sau matrice

Cu toate acestea, în plus față de aceste cazuri, ar trebui să încercați să utilizați bucla de cod îmbunătățită pentru a simplifica codul.

Pentru mai multe informații despre ciclul extins, consultați-Pentru fiecare ciclu.







Articole similare

Trimiteți-le prietenilor: