8.6 Erweitertes for und Iterable
Bisher haben wir das erweiterte for für kleine Beispiele eingesetzt, in denen es darum ging, ein Feld (Array) von Elementen abzulaufen:
Listing 8.38: com/tutego/insel/iterable/SimpleIterable.java, main()
for ( String s : new String[]{ "Eclipse", "NetBeans", "IntelliJ" } )
System.out.printf( "%s ist toll.%n", s );
8.6.1 Die Schnittstelle Iterable

Die erweiterte for-Schleife läuft nicht nur Felder ab, sondern alles, was vom Typ Iterable ist. Die Schnittstelle schreibt nur die Methode iterator() vor, die einen java.util.Iterator liefert, den das erweiterte for zum Durchlaufen verwendet.
interface java.lang.Iterable<T> |
- Iterator<T> iterator()
Liefert einen Iterator, der über alle Elemente vom Typ T iteriert.
Insbesondere die Datenstrukturklassen implementieren diese Schnittstelle, sodass mit dem erweiterten for praktisch durch Ergebnismengen iteriert werden kann.

Abbildung 8.13: Klassendiagramm von Iterable und Iterator
8.6.2 Einen eigenen Iterable implementieren *
Möchten wir selbst rechts neben dem Doppelpunkt vom erweiterten for stehen, müssen wir ein Objekt angeben, dessen Klasse Iterable implementiert und somit eine iterator()-Methode besitzt. iterator() muss dann einen passenden Iterator zurückgeben. Der wiederum muss die Methoden hasNext() und next() implementieren, um das nächste Element in der Aufzählung anzugeben und das Ende anzuzeigen. Zwar schreibt der Iterator auch remove() vor, doch das wird leer implementiert.
Unser Beispiel soll einen praktischen Iterable implementieren, um über Wörter eines Satzes zu gehen. Als grundlegende Implementierung dient der StringTokenizer, der über hasToken() die nächsten Teilfolgen und über hasMoreTokens() meldet, ob weitere Tokens ausgelesen werden können.
Beginnen wir mit dem ersten Teil, der Klasse WordIterable, die erst einmal Iterable implementieren muss, um auf der rechten Seite vom Punkt stehen zu können. Dann muss dieses Exemplar über iterator() einen Iterator zurückgeben, der über alle Wörter läuft. Dieser Iterator kann als eigene Klasse implementiert werden, doch wir implementieren die Klasse WordIterable so, dass sie Iterable und Iterator gleichzeitig verkörpert; daher ist nur ein Exemplar nötig:
Listing 8.39: com/tutego/insel/iterable/WordIterable.java
package com.tutego.insel.iterable;
import java.util.*;
class WordIterable implements Iterable<String>, Iterator<String>
{
private StringTokenizer st;
public WordIterable( String s )
{
st = new StringTokenizer( s );
}
// Method from interface Iterable
@Override public Iterator<String> iterator()
{
return this;
}
// Methods from interface Iterator
@Override public boolean hasNext()
{
return st.hasMoreTokens();
}
@Override public String next()
{
return st.nextToken();
}
@Override public void remove()
{
// No remove.
}
}
Im Beispiel:
Listing 8.40: com/tutego/insel/iterable/WordIterableDemo.java, main()
String s = "Am Anfang war das Wort – am Ende die Phrase. (Stanislaw Jerzy Lec)";
for ( String word : new WordIterable(s) )
System.out.println( word );
Die erweiterte for-Schleife baut der (Eclipse)-Compiler um zu:
String word;
WordIterable worditerable;
for ( Iterator iterator = (worditerable = new WordIterable(s)).iterator();
iterator.hasNext(); )
{
word = (String) iterator.next();
System.out.println( word );
}
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.