麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

用 for/in 在 Java 5.0 中增強(qiáng)循環(huán)

2019-11-18 13:09:03
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 在线 日本 制服 中文 欧美 | 极品国产91在线网站 | 天天鲁在线视频免费观看 | 成人国产综合 | 福利在线国产 | 一级毛片在线视频 | av国产在线被下药迷网站 | 成人在线97 | 亚洲视频综合网 | 日韩视频不卡 | 久久久久久久爱 | 一区二区三区日韩电影 | 日本精品一区二区 | 欧美一级成人一区二区三区 | 国产一级一区二区三区 | 一区二区三区在线观看视频 | 久久色在线 | 国产人成精品一区二区三 | 午夜天堂在线视频 | 51国产偷自视频区视频小蝌蚪 | 国产精品成人免费一区久久羞羞 | 色妞视频男女视频 | 成人午夜在线观看视频 | 2021国产精品视频 | 国产 视频 一区二区 | 99热高清| 天堂成人一区二区三区 | av在线大全| 狠狠婷婷综合久久久久久妖精 | 免费一级毛片在线播放视频老 | 亚洲卡通动漫在线观看 | 曰韩毛片 | 国产精品久久久久久久四虎电影 | 久久久久久久久久久久久久av | 久草在线免费看 | 99re66热这里只有精品8 | 久久免费看片 | 成人青青草 | 黄色电影免费提供 | 日韩视频在线观看免费 | 黄色影院在线看 |