Java 中的迭代器與 forEach()
1. 概述
在 Java 程式設計中,瀏覽集合和陣列至關重要。在本文中,我們討論使用Iterator
介面和forEach()
方法的兩種主要方法。我們的目標是了解它們之間的差異。無論是為了簡單性還是靈活性,理解這些迭代技術之間的差異是高效 Java 編碼的關鍵。
2. Iterator
Iterator
是我們可以用來遍歷集合的工具之一。它體現了Iterator
設計模式,該模式提供了一種按順序存取元素的標準方法,而無需暴露底層集合的表示。
讓我們來看一個例子:
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String item = it.next();
// Perform complex operations
}
Iterator
在複雜的場景中大放異彩,它允許詳細的迭代控制以及在迭代期間修改集合的能力。
讓我們來看另一個Iterator
範例:
Iterator it = list.iterator();
while (it.hasNext()) {
String item = it.next();
if (item.equals("unwanted")) {
it.remove(); // Safely remove item
}
}
然而,其冗長的性質可能會降低程式碼的可讀性,尤其是對於複雜的迭代邏輯。
3.forEach forEach()
從 Java 8 開始, Iterable
介麵包含forEach()
方法,該方法對每個集合元素執行給定的操作。
讓我們來看一個forEach()
範例:
list.forEach(item -> {
// Execute simple operations
System.out.println(item);
});
forEach()
幫助我們增強程式碼的可讀性。這透過簡潔的語法簡化了迭代,並且非常適合無需修改集合的直接遍歷。
forEach()
不直接支援修改它迭代的集合。嘗試在forEach()
循環期間向集合中刪除或添加元素可能會導致編譯錯誤“local variables referenced from a lambda expression must be final or effectively final
」:
list.forEach(item -> {
if (item.equals("unwanted")) {
// Direct removal will cause a compilation error
// list.remove(item);
}
});
原因是循環的設計目的不是要了解集合的任何結構變更。
還有另一種技術可以在forEach()
迭代期間修改集合。我們需要將項目收集到一個單獨的清單中,以便隨後修改原始清單。然而,這可能效率較低且更麻煩:
// Separate collection for items to be removed
List<String> toRemove = new ArrayList<>();
// Using forEach() to identify items to remove
list.forEach(item -> {
if (item.equals("unwanted")) {
toRemove.add(item);
}
});
// Removing the identified items from the original list
list.removeAll(toRemove);
4. Iterator
與forEach()
使用Iterator
和forEach()
循環之間的性能差異很小,不應成為選擇其中一個的主要因素。
讓我們來看看他們的比較表:
循環元素 | 句法 | 改裝能力 | 表現 |
---|---|---|---|
**Iterator** |
可讀性較差 | 支援 | 幾乎一樣 |
**forEach()** |
更具可讀性 | 不支援 | 幾乎一樣 |
如果我們需要靈活地動態修改集合,那麼迭代器是我們的最佳選擇。 forEach()
迴圈更適合強調程式碼清晰度和簡單性的場景。
5. 結論
在 Java 中,選擇使用Iterator
或使用forEach()
迴圈來迭代集合取決於我們專案的特定要求。每種方法都具有獨特的優勢,並有自己的一系列考慮因素,特別是在迭代、可用性和可讀性期間修改集合時。
在本文中,我們回顧了在 Java 中選擇Iterator
和forEach()
的關鍵點。了解每種方法的優點和限制將使我們能夠編寫更有效率、可維護和可讀的 Java 程式碼。
最後,一如既往,完整的源代碼可以在 GitHub 上獲得。