Java Reference
In-Depth Information
An Iterator provides just three methods, and two of these are use to iterate over a collection:
hasNext and next . Neither takes a parameter, but both have non-void return types, so they are used
in expressions. The way we usually use an Iterator can be described in pseudo-code as follows:
Iterator< ElementType > it = myCollection.iterator();
while(it.hasNext()) {
call it.next() to get the next element
do something with that element
}
In this code fragment, we first use the iterator method of the ArrayList class to obtain an
Iterator object. Note that Iterator is also a generic type, so we parameterize it with the type
of the elements in the collection we are iterating over. Then we use that Iterator to repeatedly
check whether there are any more elements, it.hasNext (), and to get the next element, it.
next (). One important point to note is that it is the Iterator object that we ask to return the
next item, and not the collection object. Indeed, we tend not to refer directly to the collection at
all in the body of the loop; all interaction with the collection is done via the Iterator .
Using an Iterator , we can write a method to list the tracks, as shown in Code 4.8. In effect,
the Iterator starts at the beginning of the collection and progressively works its way through,
one object at a time, each time we call its next method.
Code 4.8
Using an Iterator
to list the tracks
/**
* List all the tracks.
*/
public void listAllTracks()
{
Iterator<Track> it = tracks.iterator();
while (it.hasNext()) {
Track t = it.next();
System.out.println(t.getDetails());
}
}
Take some time to compare this version to the one using a for-each loop in Code 4.7 and the
two versions of listAllFiles shown in Code 4.3 and Code 4.5. A particular point to note
about the latest version is that we use a while loop, but we do not need to take care of the index
variable. This is because the Iterator keeps track of how far it has gotten through the collec-
tion, so that it knows both whether there are any more items left ( hasNext ) and which one to
return ( next ) if there is another.
One of the keys to understanding how Iterator works is that the call to next causes the
Iterator to return the next item in the collection and then move past that item . Therefore,
successive calls to next on an Iterator will always return distinct items; you cannot go back
to the previous item once next has been called. Eventually, the Iterator reaches the end
of the collection and then returns false from a call to hasNext . Once hasNext has returned
false , it would be an error to try to call next on that particular Iterator object—in effect, the
Iterator object has been “used up” and has no further use.
 
Search WWH ::




Custom Search