Vincent

          Vicent's blog
          隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
          數(shù)據(jù)加載中……

          For-Each 循環(huán)

          管中窺虎

          在學(xué)習(xí) java 1.5 的過程中,我使用了 sun 公布的 tutorial ,這份文檔寫的比較詳盡易明,但是對于想快速了解 tiger 而且具有較好 java 基礎(chǔ)的人來說,大篇幅的英文文檔是比較耗時間和非必需的,所以我將會歸納這份文檔的主要內(nèi)容,在保證理解的底線上,盡力減少閱讀者需要的時間。

          ?

          在以下地址可以進(jìn)入各新增語言特色介紹以及下載相關(guān)文檔(若有)。

          http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

          ?

          第二道虎紋: For-Each 循環(huán)

          目前在一個容器里做迭代訪問挺郁悶的,看看下面這個方法,方法的目的是把容器里的一系列計時任務(wù)取消。

          void ?cancelAll(Collection < TimerTask > ?c)? {

          ????
          for ?(Iterator < TimerTask > ?i? = ?c.iterator();?i.hasNext();?)

          ????????i.next().cancel();

          }

          關(guān)于

          Iterator 的部分真的很羅嗦,而且容易出錯。現(xiàn)在再看看 1.5 里帶來的 For-each 循環(huán):

          void ?cancelAll(Collection < TimerTask > ?c)?{

          ????
          for ?(TimerTask?t?:?c)

          ????????t.cancel();

          }

          這個新的循環(huán)和泛型完美配合,既保持類型安全,又去掉了冗余。

          以下是一個在試圖嵌套迭代的時候經(jīng)常會犯的錯誤。

          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()));

          ?

          原因是 i.next() 被過多的調(diào)用了。

          再看看新循環(huán)的表現(xiàn),簡直是度身定造一樣的般配。

          for ?(Suit?suit?:?suits)

          ????
          for ?(Rank?rank?:?ranks)

          ????????sortedDeck.add(
          new ?Card(suit,?rank));

          ?

          for-each 循環(huán)也適用于數(shù)組,象隱藏迭代子一樣,這次它把數(shù)組下標(biāo)藏起來了。

          // ?Returns?the?sum?of?the?elements?of?a

          int ?sum( int []?a)? {

          ????
          int ?result? = ? 0 ;

          ????
          for ?( int ?i?:?a)

          ????????result?
          += ?i;

          ????
          return ?result;

          }

          ?

          那么我們什么時候該用 for-each 循環(huán)呢?只要情況運行就應(yīng)該用,它真的讓你的代碼好看了很多。不幸的是,它有不能發(fā)揮作用的情形,就是需要用 iterator remove 方法的時候,因為 iterator 被隱藏了,你也無法調(diào)用它的方法了,新的循環(huán)不適用于過濾元素。同樣的也不適用于需要把數(shù)組中的元素替換掉的情況。最后,它也不能在平行遍歷多個容器的情況里使用,這些缺點,設(shè)計者是知道的,但是最后他們明智地選擇這樣一個簡單的,能適用于多數(shù)情況的設(shè)計方案

          posted on 2006-08-22 11:20 Binary 閱讀(189) 評論(0)  編輯  收藏 所屬分類: j2se

          主站蜘蛛池模板: 湄潭县| 道真| 鄂温| 北海市| 宿迁市| 福鼎市| 县级市| 平潭县| 临江市| 大安市| 米林县| 双峰县| 济南市| 磐安县| 绥滨县| 台北县| 五华县| 平罗县| 平果县| 阳高县| 汶川县| 华宁县| 准格尔旗| 延津县| 新平| 集贤县| 萝北县| 彭泽县| 古丈县| 马尔康县| 礼泉县| 容城县| 陇川县| 堆龙德庆县| 夏河县| 马尔康县| 松溪县| 凌海市| 隆德县| 深圳市| 庆安县|