Molte classi diverse che rappresentano sequenze hanno in comune il fatto di poter iterare sui loro elementi. Le classi iterabili hanno tipicamente in comune i metodi hasNext (che controlla se c’è un elemento successivo al corrente), next() (che passa all’elemento successivo), e reset() (che resetta l’iterazione).

public interface Iterabile{
	boolean hasNext();
	Object next();
	void reset();
}

Però ogni classe implementerà i metodi a modo suo.

Però questa implementazione non ci permette di mantenere contatori multipli sullo stesso oggetto. Le interfacce Iterable e Iterator, invece, permettono di iterare comodamente sugli oggetti, e disaccoppiano l’oggetto su cui iterare dall’oggetto che tiene la posizione dell’iterazione.

iterable

java.lang.Iterable

  • espone il metodo:
metododescrizione
Iterator<T> iterator()ritorna un iteratore per gli elementi di tipo T.

iterator

java.util.Iterator<E>

  • è un’interfaccia fondamentale che permette di iterare su collezioni.

espone i metodi:

metododescrizione
boolean hasNext()restituisce true se c’è un elemento successivo
E next()restituisce l’elemento successivo
void remove()rimuove l’elemento corrente (opzionale)

relazione iterator-iterable

L’interfaccia iterator è in relazione con iterable perché chi implementa iterable restituisce un iterator sull’oggetto-collezione.