實現 java.util.Iterator 可讓對象支持 hasNext()/next()/remove() 遍歷;實現 Iterable 更進一步,賦予對象「可被 for-each 循環遍歷」的能力(Java 5+),甚至支持 Java 8 forEach(Consumer)。本文通過一個泛型數組迭代器,演示雙介面融合實現的最佳實踐。
import java.util.Iterator;
import java.util.NoSuchElementException;
public class AarrayIterator<T> implements Iterable<T>, Iterator<T> {
private final T[] data;
private int index = 0;
public AarrayIterator(T[] data) {
this.data = data;
}
/** 重置迭代器,支持多次遍歷 */
public void setData(T[] data) {
this.data = data;
this.index = 0;
}
// ===== Iterator 方法 =====
@Override
public boolean hasNext() {
return index < data.length;
}
@Override
public T next() {
if (!hasNext()) throw new NoSuchElementException("Only " + data.length + " elements");
return data[index++];
}
@Override
public void remove() {
throw new UnsupportedOperationException("Demo iterator does not support remove()");
}
// ===== Iterable 方法 =====
@Override
public Iterator<T> iterator() {
index = 0; // 關鍵:每次獲取迭代器時重置游標
return this;
}
// ===== 測試主方法 =====
public static void main(String[] args) {
String[] names = {"rose", "petunia", "tulip"};
AarrayIterator<String> iter = new AarrayIterator<>(names);
// Java 5 for-each
for (String s : iter) System.out.println(s);
// Java 8 forEach
iter.forEach(System.out::println);
}
}
implements Iterable<T>, Iterator<T>,自身即迭代器又可迭代對象;iterator() 重置游標:每次 for-each 都會調用 iterator(),必須 index = 0,否則第二次遍歷無數據;<T> 支持任意對象類型,編譯期類型安全;next() 無元素時拋 NoSuchElementException,符合 JDK 規約;remove() 可選:文檔明確聲明不支持,拋 UnsupportedOperationException。rose
petunia
tulip
rose
petunia
tulip
ListIterator 支持雙向遍歷與索引操作;Spliterator 實現並行流支持;掌握迭代器協議,是理解集合框架、Stream 流源頭的關鍵一步。