国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

用 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 對集合進行遍歷沒有任何需要非凡處理或者復雜的地方,它工作起來,與您剛才看到的處理列表和集合的方

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 余姚市| 哈密市| 正安县| 湖州市| 抚顺县| 靖远县| 巴里| 开封县| 赤峰市| 淮滨县| 休宁县| 万源市| 丹寨县| 玉环县| 仙居县| 九江县| 府谷县| 沙田区| 潮州市| 新巴尔虎左旗| 睢宁县| 阿尔山市| 千阳县| 济阳县| 六盘水市| 遵化市| 文安县| 栾川县| 高要市| 阿坝县| 沂源县| 富阳市| 达尔| 黔西| 广南县| 会同县| 滦平县| 长宁县| 始兴县| 崇州市| 潮州市|