foreach 循环详解
生活随笔
收集整理的這篇文章主要介紹了
foreach 循环详解
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
譯自:http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
考慮如下代碼(方式一):迭代一個(gè) collection 集合對(duì)象,然后刪除集合元素 void cancelAll(Collection<TimerTask> c) {for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )i.next().cancel(); }以上迭代方式很丑陋,你知道,為什么丑陋?你看迭代器i 出現(xiàn)了3次,增加了我們出錯(cuò)幾率,而且代碼如此雜亂,我們看如下代碼(方式二foreach 結(jié)構(gòu)),它摒棄了這種丑陋。 void cancelAll(Collection<TimerTask> c) {for (TimerTask t : c)t.cancel(); } 利用方式一迭代 collection 集合對(duì)象 通常犯的錯(cuò)誤,荔枝代碼如下: List suits = ...; List ranks = ...; List sortedDeck = new ArrayList();// BROKEN - throws NoSuchElementException! for (Iterator i = suits.iterator(); i.hasNext(); )for (Iterator j = ranks.iterator(); j.hasNext(); )sortedDeck.add(new Card(i.next(), j.next())); 為什么報(bào)錯(cuò)? 當(dāng) ranks 的size 大于 suits.size 的時(shí)候,第3行中的 i.next() 就會(huì)拋出 NoSuchElementException 異常。
修改后的代碼如下(利用臨時(shí)變量 保存Suit實(shí)例,但代碼還是那么雜亂無(wú)章): // Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) {Suit suit = (Suit) i.next();for (Iterator j = ranks.iterator(); j.hasNext(); )sortedDeck.add(new Card(suit, j.next())); } 我們看foreach 結(jié)構(gòu)如何實(shí)現(xiàn) for (Suit suit : suits)for (Rank rank : ranks)sortedDeck.add(new Card(suit, rank)); 等等 foreach結(jié)構(gòu)還可以應(yīng)用到數(shù)組的遍歷 // Returns the sum of the elements of a int sum(int[] a) {int result = 0;for (int i : a)result += i;return result; } 最后:我們什么時(shí)候不能用 foreach結(jié)構(gòu) 迭代集合元素呢? case1:程序需要訪問(wèn)迭代器 然后移除當(dāng)前元素的時(shí)候;因?yàn)閒oreach 結(jié)構(gòu)隱藏了 迭代器,所以無(wú)法調(diào)用remove() 方法; case2:foreach 結(jié)構(gòu)不適用于 過(guò)濾 同樣也不適用于 遍歷過(guò)程中替換元素的操作。 case3:最后,foreach結(jié)構(gòu) 不適用于同時(shí)并行遍歷 多個(gè) 集合元素。
雖然 foreach結(jié)構(gòu)有以上缺點(diǎn),但是它的應(yīng)用可以覆蓋掉大多數(shù)的情況需要。
考慮如下代碼(方式一):迭代一個(gè) collection 集合對(duì)象,然后刪除集合元素 void cancelAll(Collection<TimerTask> c) {for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); )i.next().cancel(); }以上迭代方式很丑陋,你知道,為什么丑陋?你看迭代器i 出現(xiàn)了3次,增加了我們出錯(cuò)幾率,而且代碼如此雜亂,我們看如下代碼(方式二foreach 結(jié)構(gòu)),它摒棄了這種丑陋。 void cancelAll(Collection<TimerTask> c) {for (TimerTask t : c)t.cancel(); } 利用方式一迭代 collection 集合對(duì)象 通常犯的錯(cuò)誤,荔枝代碼如下: List suits = ...; List ranks = ...; List sortedDeck = new ArrayList();// BROKEN - throws NoSuchElementException! for (Iterator i = suits.iterator(); i.hasNext(); )for (Iterator j = ranks.iterator(); j.hasNext(); )sortedDeck.add(new Card(i.next(), j.next())); 為什么報(bào)錯(cuò)? 當(dāng) ranks 的size 大于 suits.size 的時(shí)候,第3行中的 i.next() 就會(huì)拋出 NoSuchElementException 異常。
修改后的代碼如下(利用臨時(shí)變量 保存Suit實(shí)例,但代碼還是那么雜亂無(wú)章): // Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) {Suit suit = (Suit) i.next();for (Iterator j = ranks.iterator(); j.hasNext(); )sortedDeck.add(new Card(suit, j.next())); } 我們看foreach 結(jié)構(gòu)如何實(shí)現(xiàn) for (Suit suit : suits)for (Rank rank : ranks)sortedDeck.add(new Card(suit, rank)); 等等 foreach結(jié)構(gòu)還可以應(yīng)用到數(shù)組的遍歷 // Returns the sum of the elements of a int sum(int[] a) {int result = 0;for (int i : a)result += i;return result; } 最后:我們什么時(shí)候不能用 foreach結(jié)構(gòu) 迭代集合元素呢? case1:程序需要訪問(wèn)迭代器 然后移除當(dāng)前元素的時(shí)候;因?yàn)閒oreach 結(jié)構(gòu)隱藏了 迭代器,所以無(wú)法調(diào)用remove() 方法; case2:foreach 結(jié)構(gòu)不適用于 過(guò)濾 同樣也不適用于 遍歷過(guò)程中替換元素的操作。 case3:最后,foreach結(jié)構(gòu) 不適用于同時(shí)并行遍歷 多個(gè) 集合元素。
雖然 foreach結(jié)構(gòu)有以上缺點(diǎn),但是它的應(yīng)用可以覆蓋掉大多數(shù)的情況需要。
總結(jié)
以上是生活随笔為你收集整理的foreach 循环详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 嘿 我真的好想你是什么歌 这首歌的完整歌
- 下一篇: 如何不用 List.clear() 方法