亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

用 for/in 在 Java 5.0 中增強循環

2019-11-18 13:09:03
字體:
來源:轉載
供稿:網友

  for/in 循環通常叫作增強的 for 或者 foreach,它是 java 5.0 中一個極為方便的特性。實際上它沒有提供任何新的功能,但它顯然能讓一些日常編碼任務變得更簡單一些。在本文中,您將學習這方面的許多內容,其中包括使用 for/in 在數組和集合中進行遍歷,以及如何用它避免不必要(或者只是令人厭煩的)類型轉換。您還將學習如何實現 for/in,了解新的 Iterable 接口的一些細節,甚至還將學習如何讓您自己的定制對象用這個新的構造進行遍歷。最后,您將學習 for/in 不能 做什么,以確保您能理解什么時候選擇原來的 for 是正確的選擇。
  
  越短越好
  這是資深電腦程序員都知道的一條最基本的原理:因為更短 意味著打字更少,所以更短自然也就更好。這個哲學造就了 vi 這樣的 IDE,在這類 IDE 中,像 :wq! 和 28G 這樣的命令擁有豐富的含義。這個哲學還導致一些最神秘的代碼,比如說,變量 ar 代表 Agile Runner(也可能是 Argyle,或者 Atomic Reactor 等等,總之,您明白就好)。
  
  有些時候,在努力實現短小的時候,程序員會將明確性拋到腦后。也就是說,過于短小和過于繁冗的代碼都會讓人感到痛苦不堪。變量名為 theAtomicReactorLocatedInPhilaDelphia 與名為 ar 的變量一樣讓人討厭和不方便。一定會有一個讓人興奮的解決方法,不是嗎?
  
  這個讓人興奮的方法(至少我是這么認為的)是以尋找完成某事的方便 途徑為出發點,不是為了短小而短小。作為這類解決方案的一個好例子,Java 5.0 引入了新版的 for 循環,我把它稱為 for/in。它也被稱為 foreach,有時也叫作增強的 for,但這些指的都是同一個構造。不管您叫它什么,for/in 都會使代碼變得更簡單,正如您在本文中將看到的那樣。
  
  不使用 Iterator
  使用 for/in 與“普通”for 之間的最基本區別是,您不必使用計數器(通常稱為 i 或 count)或 Iterator。參見清單 1,它顯示了一個使用的 Iterator 的for 循環:
  
  清單 1. for 循環,舊式學院風格
  
  public void testForLoop(PRintStream out) throws IOException {
  List list = getList(); // initialize this list elsewhere
  
  for (Iterator i = list.iterator(); i.hasNext(); ) {
  Object listElement = i.next();
  out.println(listElement.toString());
  
  // Do something else with this list element
  }
  }
  
  注重:假如您一直在看我寫的關于 Tiger 新特性的文章(請參閱參考資料),您就會知道,我經常感謝 O'Reilly Media, Inc.,因為它們答應我在本文中發布我其他書中的代碼示例。這意味著您得到的代碼已經通過了更多測試、更多評論,比我能提供給您的多得多。所以再次感謝 O'Reilly,假如您想了解 Tiger 的更多內容,請參考我撰寫的一些書,它們列在參考資源一節中,其中有完整的鏈接和更多的細節。
  
  假如您期待著得到如何把這個代碼轉變成新的 for/in 循環的具體解釋,我恐怕要讓您失望。清單 2 顯示了用 for/in 改寫的清單 1 中的代碼,您應該相當熟悉它。請參見下面代碼清單,我將盡可能具體地解釋 for/in 循環(但是仍然很難湊成一章)。
  
  清單 2. 轉換成 for/in
  
  public void testForInLoop(PrintStream out) throws IOException {
  List list = getList(); // initialize this list elsewhere
  
  for (Object listElement : list) {
  out.println(listElement.toString());
  
  // Do something else with this list element
  }
  }
  
  for/in 循環的基本語法如清單 3 所示。假如您還不習慣閱讀規范,那么該語法可能看起來有點古怪,但是當您一個部分一個部分了解它的時候,您會發現閱讀它實際上非常輕易。
  
  清單 3. for/in 循環的基本結構
  
  for(聲明:表達式)
  語句
  
  for/in 因何得名
  細心的讀者會注重到,所謂 for/in 根據不包含單詞 in。它的名字來自借閱的閱讀方式。在清單 2 中,您會說 for 每個對象 in 命名變量列表中,執行 ...。當然,省略號代表循環實質做的操作。您如何看待會有些差異,但是在每種表達方式中 for 和 in 都是突出的。
  
  聲明 是一個變量,例如 Object listElement。這個變量應該有自己的類型,這樣,它就可以與將遍歷的列表、數組或集合中的每一個項兼容。在清單 2 的例子中,list 包含一些對象,因此這些對象就是 listElement 的類型。
  
  表達式 就是一個表達式。它計算的結果應當是可以遍歷的(后面再詳加介紹)。在現在,只要保證表達式 計算的結果是一個集合或者數組就可以了。表達式可以簡單到就是一個變量(如清單 2 所示)或者是一個方法調用(例如 getList()),亦或是包含布爾邏輯或三目運算符的復雜表達式。只要它返回一個數組或集合,就一切 OK。
  
  語句 代表循環的內容,它對聲明 中定義的變量進行操作;當然,這是一個循環,所以語句 將應用到數組中集合的每個項目上。而且,使用大括號({ 和 })時,還能使用多條語句。
  
  其用法如下:創建一個變量,指向要遍歷的數組或集合,然后對定義的變量進行操作。不用對列表中的每個項目進行賦值,因為 for/in 替您處理了這件事。當然,假如您還覺得不太清楚,沒關系,繼續讀下去,有大量的示例讓您足夠清楚這個事件。
  
  但是,在進行下一步之前,我想用更加符合規范的方式說明 for/in 的工作方式。清單 4 顯示了在提供通用化類型時,實際發揮作用的 for/in 循環。以下是編譯器把該循環轉換成普通的 for 循環之后,語句實際看起來的樣子。
  
  您明白了嗎?編譯器實際上把這個更短、更方便的 for/in 語句變成了一個更加編譯器友好的 for 循環,而且您不會受到這項工作的影響。這就是為什么我認為它方便,而不僅僅說它更簡短的原因。
  
  清單 4. 轉換后的 for/in 循環,帶有一個 Iterable
  
  for (Iterator #i = (eXPression).iterator(); #i.hasNext(); ) {
  declaration = #i.next();
  statement
  }
  
  清單 5 是另外一個經過編譯器轉換之后的 for/in,這次沒有通用化類型。雖然更簡單,但做的事是一樣的。但是在每種情況下,您都可以很輕易地在腦子里(并通過編程方式)把 for/in 語句轉換成普通的 for 語句,假如您能在腦子子里做這個轉換,事情就變得極為輕易了。
  
  清單 5. 轉換后的 for/in 循環,沒有未經參數化的類型
  
  for (Iterator #i = (expression).iterator(); #i.hasNext(); ) {
  declaration = #i.next();
  statement
  }
  
  使用數組
  現在您已經了解了基本的語義,可以繼續了解一些更具體的示例了。您已經看到 for/in 如何處理列表了;處理數組也一樣輕易。與集合相同,數組也被賦值(如清單 6 所示),然后這些值被逐個取出,并被處理。
  
  清單 6. 簡單的數組初始化
  
  int[] int_array = new int[4];
  String[] args = new String[10];
  float[] float_array = new float[20];
  
  對于使用 for 以及計算器或索引變量的場合,現在就可以使用 for/in(當然,前提是您正在使用 Tiger)。清單 7 顯示了另外一個簡單的示例:
  
  清單 7. 用 for/in 對數組進行循環就是小菜一碟
  
  public void testArrayLooping(PrintStream out) throws IOException {
  int[] primes = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 };
  
  // Print the primes out using a for/in loop
  for (int n : primes) {
  out.println(n);
  }
  }
  
  沒有任何需要非凡說明的地方,這些都是非?;镜臇|西。數組被類型化,所以您需要很清楚地知道數組中每個項目的變量類型是什么。這個示例創建了變量(在這個示例中名為 n),然后對這個變量進行操作。非常簡單,不是嗎?我告訴過您在這里沒有什么復雜的東西。
  
  實際上,數據中有什么類型并不是問題,您只需為聲明 選擇好正確的類型就可以了。在清單 8 中,數組的元素是 Lists。所以您得到的實際上是一個集合數組。同樣,使用 for/in 就能使這些變得非常簡單。
  
  清單 8. 用 for/in 還可以在對象數組上循環
  
  public void testObjectArrayLooping(PrintStream out) throws IOException {
  List[] list_array = new List[3];
  
  list_array[0] = getList();
  list_array[1] = getList();
  list_array[2] = getList();
  
  for (List l : list_array) {
  out.println(l.getClass().getName());
  }
  }
  
  甚至還可以在 for/in 循環中再加上一層循環,如清單 9 所示:
  
  清單 9. 在 for/in 內部使用 for/in 不會有任何問題!
  
  public void testObjectArrayLooping(PrintStream out) throws IOException {
  List[] list_array = new List[3];
  
  list_array[0] = getList();
  list_array[1] = getList();
  list_array[2] = getList();
  
  for (List l : list_array) {
  for (Object o : l) {
  out.println(o);
  }
  }
  }
  
  處理集合
  同樣,簡單性也是我們關注的內容。使用 for/in 對集合進行遍歷沒有任何需要非凡處理或者復雜的地方,它工作起來,與您剛才看到的處理列表和集合的方

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲夜色av98在线观看| 精品久久久久人成| 最近2019中文字幕在线高清| 欧美久久精品午夜青青大伊人| 久久资源免费视频| 亚洲视频日韩精品| 久久精品视频99| 久久人人爽亚洲精品天堂| 在线视频欧美日韩精品| 欧美黄色片免费观看| 亚洲免费视频一区二区| 日韩电影大片中文字幕| 欧美性猛交xxxx富婆弯腰| 欧美在线一级va免费观看| 国产aⅴ夜夜欢一区二区三区| 91高清免费在线观看| 欧美与黑人午夜性猛交久久久| 欧美精品在线视频观看| 日韩av电影免费观看高清| 久久久久久亚洲精品| 欧洲成人午夜免费大片| 欧美自拍视频在线| 色妞欧美日韩在线| 黄色成人在线播放| 欧美精品中文字幕一区| 97超级碰碰碰久久久| 久久国产精品偷| 庆余年2免费日韩剧观看大牛| 欧美高清在线播放| 国产一区二区三区免费视频| 日韩久久午夜影院| 91成人免费观看网站| 亚洲一区av在线播放| 国产精品电影网| 欧美性xxxx极品hd满灌| 热久久免费视频精品| 欧美在线欧美在线| 精品久久在线播放| 亚洲欧洲美洲在线综合| 欧美精品激情在线| 国产精品678| 亚洲精品久久久久中文字幕欢迎你| 亚洲一区999| 成人在线免费观看视视频| 欧美成人免费小视频| 国产精品户外野外| 日韩在线视频网| 久久久久这里只有精品| 久热在线中文字幕色999舞| 亚洲最新视频在线| 性金发美女69hd大尺寸| 亚洲一级片在线看| 成人久久18免费网站图片| 啪一啪鲁一鲁2019在线视频| 欧美性xxxx极品高清hd直播| 国产一区二区三区日韩欧美| 精品国产91久久久| 亚洲一区二区久久久| 国产精品白丝jk喷水视频一区| 日av在线播放中文不卡| 91午夜在线播放| 中文日韩在线视频| 中文字幕精品一区久久久久| 国产狼人综合免费视频| 国产精品视频久久| 亚洲天堂网站在线观看视频| 欧美韩国理论所午夜片917电影| 91国产视频在线| 久久久久99精品久久久久| 国产美女扒开尿口久久久| 亚洲成人免费网站| 日韩av在线资源| 日韩免费av在线| 亚洲国产精品热久久| 亚洲精品欧美一区二区三区| 国产一区玩具在线观看| 成人在线视频福利| 亚洲美女精品成人在线视频| 精品无人国产偷自产在线| 亚洲第一精品福利| 91国产中文字幕| 日韩精品视频在线| 亚洲国产精品99久久| 日韩精品中文字幕视频在线| 成人黄色av免费在线观看| 日韩亚洲综合在线| 日韩电影大片中文字幕| www.亚洲人.com| 亚洲色图13p| 在线观看免费高清视频97| 精品欧美激情精品一区| 日韩国产欧美精品一区二区三区| 久久久免费观看| 91精品国产91久久久久久久久| 亚洲欧洲av一区二区| 亚洲国产精品久久久久| 国产精品尤物福利片在线观看| 国产精品久久久久一区二区| 麻豆一区二区在线观看| 日韩高清电影免费观看完整| 亲爱的老师9免费观看全集电视剧| 欧美日韩国产精品一区二区三区四区| 国产精品大陆在线观看| 亚洲欧美国产va在线影院| 欧美一区三区三区高中清蜜桃| 欧美日韩国产精品| 精品久久久久久中文字幕一区奶水| 欧美日本高清一区| 成人啪啪免费看| 欧美国产亚洲精品久久久8v| 国产精品视频在线播放| 亚洲一区二区免费| 日本成人激情视频| 久久精品国产一区| 永久免费看mv网站入口亚洲| 97国产真实伦对白精彩视频8| 亚洲视频在线播放| 国产成人精品日本亚洲专区61| 日韩中文字幕精品| 在线播放国产一区二区三区| 97免费中文视频在线观看| 国产精品第2页| 黄网动漫久久久| 国产精品视频99| 亚洲黄页网在线观看| 97av在线视频| 深夜成人在线观看| 久久久精品视频在线观看| 亚洲国产高潮在线观看| 国产精品69精品一区二区三区| 91精品国产综合久久久久久蜜臀| 精品久久久久久中文字幕大豆网| 国内成人精品视频| 在线午夜精品自拍| 国产一区二区香蕉| 欧美日韩免费一区| 黑人极品videos精品欧美裸| 欧美亚洲在线观看| 国产成人涩涩涩视频在线观看| 久久天天躁狠狠躁夜夜躁| 国产97在线视频| 亚洲xxxx视频| 国产成+人+综合+亚洲欧洲| 综合av色偷偷网| 精品久久久久久久久久国产| 日韩精品黄色网| 性色av一区二区三区在线观看| 日韩精品视频在线免费观看| 中文字幕av一区二区三区谷原希美| 国产成人精品免费视频| 国产91久久婷婷一区二区| 91精品久久久久久久久久久| 成人久久18免费网站图片| 国产69久久精品成人| 97视频在线观看播放| 韩剧1988免费观看全集| 激情av一区二区| 夜夜嗨av一区二区三区免费区| 国产精品日韩精品| 亚洲欧美色婷婷| 欧美黄色性视频| 欧美激情免费看| 国产精品欧美日韩久久| 韩国三级日本三级少妇99|