2021/03/29

[筆記] Effective Java #58 for-each 優先於傳統的 for

Effective Java 3rd 簡體中文版筆記 #58 for-each 優先於傳統的 for
要遍歷元素,可以使用迭代器 (iterator) 或是陣列索引來訪問,一旦發生錯誤,編譯器不一定能發現錯誤。
// iterator
for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {
    doSomething(i.next());
}
// array
for (int i = 0; i < a.length; i++) { doSomething(a[i]); }
使用 for-each 可以減少上述問題,效能上也不會受到影響。
for (Element e : elements) { doSomething(e); }
下列的程式將列出所有骰子可能出現的點數組合,但這段程式是有 BUG 的,它並不會印出 36 種組合,只會印出 6 種組合。
enum Face { ONE, TWO, THREE, FOUR, FIVE, SIX }

Collection<Face> faces = EnumSet.allOf(Face.class);
for (Iterator<Face> i = faces.iterator(); i.hasNext(); )
    for (Iterator<Face> j = faces.iterator(); j.hasNext(); )
        System.out.println(i.next() + " " + j.next());
正確的程式應該修改為 i.next() 需要先被保留起來,而不是每次 println 時就執行一次 next()
for (Iterator<Face> i = faces.iterator(); i.hasNext(); ) {
    Face f = i.next();
    for (Iterator<Face> j = faces.iterator(); j.hasNext(); ) {
        System.out.println(f + " " + j.next());
    }
}
若是改用 for-each,就可以避免上述的錯誤。
for (Face f1 : faces)
    for (Face f2 : faces)
        System.out.println(f1 + " " + f2);
但仍是有幾種狀況是無法使用 for-each 的:
  • 刪除或是過濾元素 - 要移除某些特定條件的元素
  • 轉換 - 將元素作取代的動作
  • 平行迭代
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-58-for-each-for.html

沒有留言:

張貼留言