Éditer sur GitHub

Iterator

Problème

Nous voulons des traitements capables de fonctionner sur tous les types de collections (List, Map, Set...).

Solution

Le patron de conception itérateur propose de définir une abstraction sur le parcours d'une collection :

UML_DP_Iterator

interface Iterator {
    public boolean hasNext() ;
    public Object next() ;
}

En procédant ainsi, nous aurons des traitements moins consommateur de mémoire et plus réutilisables que ceux dépendant d'interface précises (List, Map, Set...).

Variantes

Nous soulignerons qu'il existe plusieurs variantes :

En noterons aussi qu'il existe plusieurs styles d'interfaces permettant d'itérer sur des collections (stream, iterator, generator,...) et qu'il sera possible de réaliser des conversions en s'appuyant sur le patron de conception Adaptateur :

const myReadableStream = ReadableStream.from(iteratorOrAsyncIterator);

Enfin, nous remarquerons que certains langages tels JavaScript et PHP de nombreux langages généralisent la notion de collection itérable afin d'unifier le parcours des collections, des résultats des générateurs,... :

for ( const item of anyIterableType ){
    console.log(item);
}

Liens utiles