90 likes | 104 Views
Learn the basics of implementing and using the iterator pattern to traverse collections in Java. Hide traversal details, avoid managing index/cursor manually, and disperse the cost of expensive object construction. Real-world examples and benefits explained.
E N D
What is Iterator • Category: Behavioral • Generic Way to Traverse Collection • Not Related to Collection Implementation Details • Not Related to the direction/fashion with which the collection is traversed
How to Use Iterator • Implementation Details • Have a class (Class A) with which iteration makes sense • Create a class (Class B) that implements the java.util.Iterator interface • Class B should manage the iteration state over Class A for a single client. • Usage Details • Call constructing iterator() method on collection object. • Use Iterator object returned to iterate elements (next(), hasNext())
How to Use Iterator • Example Iterator implementation (note: similar to actual Java implementation) // Note: Some features are not implemented… public class VectorIterator implements java.util.Iterator { private Vector collection; private int cursor=0; public VectorIterator(Vector toIterate) { collection = toIterate; } public boolean hasNext() { return (cursor < collection.size()); } public void next() { cursor++; Object next = collection.get(cursor); } }
Traditional Looping Vector aVector = new Vector(); // load vector with elements // Implementation omitted for(int i=0; i<aVector.size();i++) { Object anElem = aVector.get(i); } Iterator Looping Vector aVector = new Vector(); // load vector with elements // Implementation omitted Iterator elements = aVector.iterator(); while(elements.hasNext()) { Object anElem = elements.next(); } How to Use Iterator
Class Diagram From (Stephen Stelting, Olav Maassen, Applied Java™ Patterns)
Why Iterator • Hides details of Collection Traversal • Avoids the ugly, and sometimes bug-prone index/cursor management (int i=…) • The iterator pattern can be used to disperse the cost of expensive object construction
In the Real World • Java has built in Iterator Support for the Collections Library (java.util.Iterator) • Vector, ArrayList, LinkedList, HashSet, TreeSet, etc (Collection.iterator() method). • Iterator may be traversing an Array, a LinkedList, or even a binary tree, but the code using the library knows no difference. • Developers can reuse the Iterator interface for their own libraries/implementations
In the Real World • Iterator can be used to defer expensive reads such as database calls and file parsing until it is actually necessary. • In combination with the factory pattern, collection type choices can be completely abstracted from the program, and into configuration files.
Advanced Java Examples public class CollectionsExample { public static void main(String[] args) { Collection collectionA = null; collectionA = createCollection(args); iterateCollection(collectionA); } public static Collection createCollection(String[] args) { Collection collection = null; if(args[0].equals(“Vector”)) { // returns a index based list walking iterator collection = new Vector(); } else if(args[0].equals(“TreeSet”)) { // returns a tree walking iterator. collection = new TreeSet(); } return collection; } // Loop code stays the same regardless of the implementation public static void iterateCollection(Collection collection) { Iterator elements = collection.iterator(); while(elements.hasNext()) { Object anObj = elements.next(); } } }