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

Java 5.0 增強型 for 循環 (for/in) 深度解析

     編輯:Java 相關知識

簡介

for/in 循環(又稱 Enhanced for、foreach)是 Java 5.0 引入的語法糖,雖未提供新功能,但大幅簡化陣列與集合遍歷代碼,減少樣板代碼,提升可讀性。

基本語法

for (Type variable : expression) {
    statement;
}
  • variable:迭代變數,型別需與集合/陣列元素相容。
  • expression:結果為陣列或實作 Iterable 的集合。
  • statement:循環體,可使用大括號包含多行敘述。

從傳統 Iterator 到 for/in

舊式寫法

for (Iterator i = list.iterator(); i.hasNext(); ) {
    Object elem = i.next();
    out.println(elem.toString());
}

for/in 簡化版

for (Object elem : list) {
    out.println(elem.toString());
}

編譯器視角

編譯器將 for/in 轉換為等價的 Iterator 代碼:

for (Iterator<E> #i = (expression).iterator(); #i.hasNext(); ) {
    declaration = #i.next();
    statement;
}

泛型版本自動推導型別參數,無泛型時使用原始型別 Iterator。

陣列遍歷

語法一致,編譯器自動處理索引:

int[] primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
for (int n : primes) {
    out.println(n);
}

物件陣列同理:

List[] listArray = new List[3];
// ... 初始化
for (List l : listArray) {
    for (Object o : l) { // 巢狀 for/in
        out.println(o);
    }
}

集合遍歷

List、Set 等皆可直接使用:

List<String> wordList = new ArrayList<>();
Set<String> wordSet = new HashSet<>();

for (String word : args) { // args 為 String[]
    wordList.add(word);
    wordSet.add(word);
}

for (String word : wordList) { // 保持順序、允許重複
    System.out.print(word + " ");
}
for (String word : wordSet) { // 無序、去重
    System.out.print(word + " ");
}

泛型加持:消除強制轉型

搭配 Java 5.0 泛型,迭代變數可直接使用具體型別:

List<String> wordList = new ArrayList<>();
for (String word : wordList) { // 無需 (String) 轉型
    System.out.print(word + " ");
}

編譯期型別檢查,減少運行時 ClassCastException 風險。

讓自訂類別支援 for/in

實作 Iterable 介面

核心在於實作 java.lang.Iterable<E>,唯一需實作方法:Iterator<E> iterator()。

策略一:繼承現有集合(推薦)

public class GuitarManufacturerList extends LinkedList<String> {
    public boolean add(String manufacturer) {
        if (manufacturer.indexOf("Guitars") == -1) return false;
        return super.add(manufacturer);
    }
}
// 直接使用
for (String m : new GuitarManufacturerList()) { ... }

策略二:手動實作 Iterator(特殊遍歷邏輯)

public class TextFile implements Iterable<String> {
    private final String filename;
    public TextFile(String filename) { this.filename = filename; }

    public Iterator<String> iterator() {
        return new TextFileIterator();
    }

    private class TextFileIterator implements Iterator<String> {
        private BufferedReader in;
        private String nextLine;

        public TextFileIterator() {
            try {
                in = new BufferedReader(new FileReader(filename));
                nextLine = in.readLine(); // 預讀第一行
            } catch (IOException e) {
                throw new IllegalArgumentException(e);
            }
        }

        public boolean hasNext() { return nextLine != null; }

        public String next() {
            try {
                String result = nextLine;
                nextLine = in.readLine();
                if (nextLine == null) in.close();
                return result;
            } catch (IOException e) {
                throw new IllegalArgumentException(e);
            }
        }

        public void remove() { throw new UnsupportedOperationException(); }
    }

    public static void main(String[] args) {
        String file = args.length > 0 ? args[0] : "TextFile.java";
        for (String line : new TextFile(file)) System.out.println(line);
    }
}

for/in 的限制

1. 無法取得索引/位置

需索引時仍須使用傳統 for:

for (int i = 0; i < list.size(); i++) {
    String word = list.get(i);
    // 使用 i 進行定位、字串拼接等
}

2. 無法在遍歷中移除元素

需移除時使用 Iterator 顯式呼叫 remove():

for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
    if (it.next().contains("1")) it.remove();
}

總結

for/in 是提升代碼簡潔度的利器,適用於單純遍歷場景。需索引、移除元素或複雜控制流時,請繼續使用傳統 for 或 Iterator。善用語法糖,寫出更易維護的 Java 代碼。

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