Iterable è un’Interfaccia che fornisce un meccanismo per iterare sequenzialmente sugli elementi di una collezione o di un insieme di dati, senza esporre la loro struttura interna.
Package: java.lang
CARATTERISTICHE PRINCIPALI
- Interfaccia radice delle collezioni iterate: Tutte le classi che vogliono essere iterate (come Collection, List, Set, Queue) implementano Iterable.
- Supporto al for-each: Grazie a
iterator(), permette l’uso del for-each loop in modo semplice e leggibile. - Iterazione sicura: L’iterazione avviene tramite un
Iterator, che può prevenire problemi durante la modifica della collezione mentre la si scorre. - Metodi di utilità con Java 8+: Include metodi
defaultcomeforEachespliteratorper operazioni funzionali e parallele.
METODI PRINCIPALI
| Metodo | Descrizione |
|---|---|
Iterator<T> iterator() | Restituisce un iteratore sugli elementi. |
default void forEach(Consumer<? super T> action) | Applica un’azione a ogni elemento della sequenza (Java 8+). |
default Spliterator<T> spliterator() | Restituisce uno spliterator per l’iterazione parallela o sequenziale (Java 8+). |
Metodo iterator():
L’unico metodo astratto obbligatorio è:
Iterator<T> iterator();Deve restituire un oggetto Iterator che conosce come scorrere la collezione
boolean hasNext(); // c'è un altro elemento?
T next(); // restituisce il prossimo elemento
void remove(); // rimuove l’elemento corrente (opzionale)Il corpo di Iterator viene definito in modo differente da ogni classe che implementa Iterable, ma la struttura deve definire sempre hasNext(), next() e remove().
DEFAULT METHODS
Dal Java 8, Iterable ha metodi con implementazione di default:
forEach(Consumer): esegue un’azione per ogni elemento:
lista.forEach(s -> System.out.println(s.toLowerCase()));spliterator(): usato per operazioni parallele con Stream:
Spliterator<String> spliterator = lista.spliterator();
while(spliterator.tryAdvance((elemento) -> {
System.out.println(elemento);
})) {RELAZIONE CON COLLECTION
Tutte le interfacce principali di java.util estendono Iterable:
Iterable
└── Collection
├── List
├── Set
└── QueueQuindi:
ArrayList,HashSet,LinkedList,TreeSet, ecc. sono tutte Iterable.- Per questo puoi scrivere:
List<String> lista = List.of("A", "B", "C");
for (String s : lista) {
System.out.println(s);
}Il for-each funziona perché List estende Collection che estende Iterable.
ESEMPIO
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorExample {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("Santana");
lista.add("Money");
lista.add("Gang");
Iterator<String> it = lista.iterator();
while (it.hasNext()) {
String parola = it.next();
System.out.println(parola);
}
}
}
/* Output:
* Sanatana
* Money
* Gang
* /
it(iterator) è una sorta di cursore che viene spostato avanti nella collezione.