Jelenlegi hely

6.2. A for ciklus

A for utasítás jó módszer egy értéktartomány bejárására. A for utasításnak van egy hagyományos formája, és a Java 5.0-tól kezdődően egy továbbfejlesztett formája is, amit tömbökön és gyűjteményeken való egyszerű bejárásnál használhatunk. A for utasítás általános formája a következőképpen néz ki:

for (inicializálás; feltétel; növekmény) {
    utastás(ok)
}

Az inicializálás egy olyan kifejezés, amely kezdőértéket ad a ciklusnak – ez egyszer, a ciklus elején fut le. A feltétel kifejezés azt határozza meg, hogy meddig kell a ciklust ismételni. Amikor a kifejezés hamisként értékelődik ki, a ciklus nem folytatódik. Végezetül a növekmény egy olyan kifejezés, amely minden ismétlődés után végrehajtódik a ciklusban. Mindezen összetevők opcionálisak. Tulajdonképpen ahhoz, hogy egy végtelen ciklust írjunk, elhagyjuk mindhárom kifejezést:

for ( ; ; ) {
    ...
}

A for ciklusokat gyakran arra használjuk, hogy egy tömb elemein vagy egy karakterláncon végezzünk iterációt. Az alábbi példa, ForDemo, egy for utasítást használ arra, hogy végighaladjon egy tömb elemein és kiírja őket.

public class ForDemo {
    public static void main(String[] args) {
        int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 };

        for (int i = 0; i < arrayOfInts.length; i++) {
            System.out.print(arrayOfInts[i] + " ");
        }
        System.out.println();
    }
}

A program futási eredménye:

32 87 3 589 12 1076 2000 8 622 127

Megjegyezzük, hogy egy lokális változó is deklarálható a for ciklus inicializáló kifejezésében. Ennek a változónak az érvényessége a deklarációjától a for utasítás által vezérelt blokk végéig terjed, tehát mind a lezáró és a növekmény kifejezéseiben is használhatók. Ha a for ciklust vezérlő változóra nincs szükség a cikluson kívül, a legjobb, ha a változót az értékadó kifejezésben deklaráljuk. Az i, j és k neveket gyakran a for ciklusok vezérlésére használjuk, ezeknek a for ciklus értékadó kifejezésén belül való deklarálása leszűkíti élettartamukat, és csökkenti a hibalehetőségeket.

Gyűjteményeken és tömbökön való bejárás a kibővített for ciklussal

Az 5.0-ban egy újfajta for utasítást hoztak létre kifejezetten gyűjteményekhez és tömbökhöz. Az utasítás általános alakja:

for (elemtípus elem : tároló) {
    utasítás(ok)
}

Itt egy kis kódrészlet, ami ugyanazt a feladatot végzi, mint az előző kódrészlet.

public class ForEachDemo {
    public static void main(String[] args) {
        int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 };
        for (int element : arrayOfInts) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
}

A kibővített for utasítás igazán akkor előnyös, amikor gyűjteményekre alkalmazzuk (osztályok, amik a Collection interfészt implementálják). Itt látható egy régi típusú for utasítás, ami iterátor segítségével egy gyűjteményen halad végig:

void cancelAll(Collection<TimerTask> c) {
    for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )
        i.next().cancel();
}

Most nem kell aggódnunk a különös <TimerTask> kódrészlet miatt. Később fogunk magyarázatot adni a részletekre. A lényeg az, hogy elkerülhetjük ezt a kibővített for ciklus használatával:

void cancelAll(Collection<TimerTask> c) {
    for (TimerTask t : c)
        t.cancel();
}

Amikor iterációkat ágyazunk egybe, a kibővített for utasítás még jobb, mivel fölösleges kódrészeket kerülhetünk el. Például:

for (Suit suit : suits) {
    for (Rank rank : ranks)
        sortedDeck.add(new Card(suit, rank));
}

A kibővített for utasítás sajnos nem működik mindenhol. Hogyha pl. tömbindexekhez akarunk hozzáférni, a kibővített for nem fog működni. Amikor csak lehet, a továbbfejlesztett for-t használjuk, több programhibát is kiküszöbölhetünk, és a forráskódunk rendezettebb lesz.