Iterator
An Iterator is a way to step over each element in a collection without exposing the collection's underlying representation to clients. In JAVA, it is sometimes quicker to use the for-each loop, but Iterators are still needed in some cases. The Iterator design in JAVA is arguably broken, see Command query separation.
Use When
Use the iterator pattern when:
- You want to access the contents of a collection sequentially without exposing the collection's underlying representation to clients.
- You want to support multiple traversals of a collection.
- You want to provide the same interface for traversing different collections.
Structure
Examples
A simple use of an Iterator to print out all names in a collection in JAVA:
Collection<String> names = new HashSet<String>(); ... Iterator<String> myIterator = names.iterator(); while(myIterator.hasNext()) { String name = myIterator.next(); System.out.println(name); }
The for-each loop in JAVA can perform the same task, in a somewhat neater fashion (syntactically):
Collection<String> names = new HashSet<String>(); ... for(String name : names) { System.out.println(name); }
However, consider the following example:
Collection<String> names = new HashSet<String>(); ... public void removeNames(String lastName) { for(String name : names) { if(name > lastName) names.remove(name); } }
This valid looking code will throw a ConcurrentModificationException, as directly removing an element from a collection while stepping through the collection could cause the code to "get lost". In this example, an Iterator should be used:
Collection<String> names = new HashSet<String>(); ... public void removeNames(String lastName) { Iterator<String> myIterator = names.iterator(); while(myIterator.hasNext()) { String name = myIterator.next(); if(name > lastName) myIterator.remove(); } }
Design patterns | |
---|---|
Creational: Abstract Factory | Builder | Factory Method | Prototype | Singleton |