首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 經典實戰:手寫通用迭代器實現 Iterable 與 Iterator 雙重協議

     編輯:Java 綜合教學

Java 經典實戰:手寫通用迭代器實現 Iterable 與 Iterator 雙重協議

實現 java.util.Iterator 可讓對象支持 hasNext()/next()/remove() 遍歷;實現 Iterable 更進一步,賦予對象「可被 for-each 循環遍歷」的能力(Java 5+),甚至支持 Java 8 forEach(Consumer)。本文通過一個泛型數組迭代器,演示雙介面融合實現的最佳實踐。

核心代碼:AarrayIterator<T>

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);
    }
}

關鍵設計點解析

  1. 雙重實現:implements Iterable<T>, Iterator<T>,自身即迭代器又可迭代對象;
  2. iterator() 重置游標:每次 for-each 都會調用 iterator(),必須 index = 0,否則第二次遍歷無數據;
  3. 泛型化:<T> 支持任意對象類型,編譯期類型安全;
  4. 異常規範:next() 無元素時拋 NoSuchElementException,符合 JDK 規約;
  5. remove() 可選:文檔明確聲明不支持,拋 UnsupportedOperationException。

運行輸出

rose
petunia
tulip
rose
petunia
tulip

擴展練習

  • 實現 ListIterator 支持雙向遍歷與索引操作;
  • 結合 Spliterator 實現並行流支持;
  • 為自定義集合類(如鏈表、樹)編寫專用迭代器。

掌握迭代器協議,是理解集合框架、Stream 流源頭的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved