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
```
2020-07-15 20:06:58 +03:00
2020-08-29 21:29:15 +03:00
Here's the `Item` class:
```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 )