for/in 循環(又稱 Enhanced for、foreach)是 Java 5.0 引入的語法糖,雖未提供新功能,但大幅簡化陣列與集合遍歷代碼,減少樣板代碼,提升可讀性。
for (Type variable : expression) {
statement;
}
Iterable 的集合。for (Iterator i = list.iterator(); i.hasNext(); ) {
Object elem = i.next();
out.println(elem.toString());
}
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 風險。
核心在於實作 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()) { ... }
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:
for (int i = 0; i < list.size(); i++) {
String word = list.get(i);
// 使用 i 進行定位、字串拼接等
}
需移除時使用 Iterator 顯式呼叫 remove():
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
if (it.next().contains("1")) it.remove();
}
for/in 是提升代碼簡潔度的利器,適用於單純遍歷場景。需索引、移除元素或複雜控制流時,請繼續使用傳統 for 或 Iterator。善用語法糖,寫出更易維護的 Java 代碼。