2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								layout: pattern
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								title: Iterator
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								folder: iterator
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 18:03:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								permalink: /patterns/iterator/
							 
						 
					
						
							
								
									
										
										
										
											2015-08-20 21:40:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								categories: Behavioral
							 
						 
					
						
							
								
									
										
										
										
											2021-05-19 10:49:05 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								language: en
							 
						 
					
						
							
								
									
										
										
										
											2016-08-20 20:49:28 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								tags:
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 22:22:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								 -  Gang of Four
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								---
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Also known as
  
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Cursor
							 
						 
					
						
							
								
									
										
										
										
											2015-11-04 21:13:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Intent
  
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Provide a way to access the elements of an aggregate object sequentially without exposing its 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								underlying representation.
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Explanation
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Real-world example
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  Treasure chest contains a set of magical items. There multiple types of items such as rings, 
  
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  potions, and weapons. The items can be browsed by type using an iterator the treasure chest 
  
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  provides. 
  
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								In plain words
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  Containers can provide a representation agnostic iterator interface to provide access to the 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  elements. 
  
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Wikipedia says
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								>  In object-oriented programming, the iterator pattern is a design pattern in which an iterator is 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								>  used to traverse a container and access the container's elements.
  
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Programmatic Example**
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The main class in our example is the `TreasureChest`  that contains items.
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```java
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public class TreasureChest {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-30 20:28:47 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  private final List< Item >  items;
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public TreasureChest() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    items = List.of(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.POTION, "Potion of courage"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.RING, "Ring of shadows"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.POTION, "Potion of wisdom"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.POTION, "Potion of blood"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.WEAPON, "Sword of silver +1"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.POTION, "Potion of rust"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.POTION, "Potion of healing"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.RING, "Ring of armor"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.WEAPON, "Steel halberd"),
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new Item(ItemType.WEAPON, "Dagger of poison"));
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public Iterator< Item >  iterator(ItemType itemType) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return new TreasureChestItemIterator(this, itemType);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public List< Item >  getItems() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return new ArrayList< >(items);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Here's the `Item`  class:
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								```java
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								public class Item {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  private ItemType type;
							 
						 
					
						
							
								
									
										
										
										
											2020-07-30 20:28:47 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  private final String name;
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public Item(ItemType type, String name) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    this.setType(type);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    this.name = name;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  @Override 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public String toString() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return name;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public ItemType getType() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return type;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  public final void setType(ItemType type) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    this.type = type;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public enum ItemType {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ANY, WEAPON, RING, POTION
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								The `Iterator`  interface is extremely simple.
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```java
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								public interface Iterator< T >  {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  boolean hasNext();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  T next();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In the following example, we iterate through the ring-type items found in the chest. 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```java
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								var itemIterator = TREASURE_CHEST.iterator(ItemType.RING);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								while (itemIterator.hasNext()) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  LOGGER.info(itemIterator.next().toString());
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Program output:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```java
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ring of shadows
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Ring of armor
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 20:06:58 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-07 20:01:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Class diagram
  
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Applicability
  
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Use the Iterator pattern
							 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-29 21:29:15 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  To access an aggregate object's contents without exposing its internal representation. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  To support multiple traversals of aggregate objects. 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  To provide a uniform interface for traversing different aggregate structures. 
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-19 10:39:45 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Tutorials
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								*  [How to Use Iterator? ](http://www.tutorialspoint.com/java/java_using_iterator.htm ) 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-24 15:57:20 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Known uses
  
						 
					
						
							
								
									
										
										
										
											2015-08-13 23:54:40 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-15 18:03:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  [java.util.Iterator ](http://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html ) 
						 
					
						
							
								
									
										
										
										
											2016-08-20 20:49:28 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  [java.util.Enumeration ](http://docs.oracle.com/javase/8/docs/api/java/util/Enumeration.html ) 
						 
					
						
							
								
									
										
										
										
											2015-09-22 18:25:56 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-01-03 21:14:30 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								## Credits
  
						 
					
						
							
								
									
										
										
										
											2015-09-22 18:25:56 +05:30 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-06 13:31:07 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  [Design Patterns: Elements of Reusable Object-Oriented Software ](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59 ) 
						 
					
						
							
								
									
										
										
										
											2020-07-07 18:05:11 +03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								*  [Head First Design Patterns: A Brain-Friendly Guide ](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b )