[DanoR][Java代碼][邏輯精簡::for循環遍歷Iterator迭代器]

博主有較強的強迫傾向java

今天強迫症犯了,就想把代碼都精簡了!
結果發現一個關於for循環遍歷Iterator迭代器的精簡的寫法,利用邏輯代數實現。函數

定義:code

HashMap<String, String> map = new HashMap<String, String>();
map.put("1","a");
map.put("2","b");
map.put("3","c");
map.put("4","d");

```java
Iterator it = map.values().iterator();//迭代器對象

- 通常的寫法:
```java
for (; it.hasNext(); )
    System.out.println(it.next());
  • 惋惜的是, Iterator不支持這樣的寫法,
    最喜歡這種寫法了,不用考慮結束條件,又有循環變量s能夠直接使用,不用擔憂屢次調用next()產生錯誤。
for(String s:it)//這樣是錯的,不支持。
    System.out.println(s);

因此做爲一個有強迫傾向的人, 但願找到一種接近上述特性的寫法it


天無絕人之路,for循環

Java語言有一個我很喜歡的特性————容許在表達式中賦值
流的IO讀寫操做就是一個十分典型的應用。變量

經驗告訴我,只要利用這個特性就能實現個人目的:循環

  • 首先,明確Iterator通常是怎麼遍歷的。遍歷

    • Iterator是經過兩個函數——hasNext()next()函數互相配合遍歷的。
    • hasNext()判斷是否存在下個對象。
    • next()則返回下個對象並移動遊標到下下個對象。
  • 根據上述特性概括一下,上述邏輯等價於:map

    每次循環
    ----hasNext()判斷
    --------若是truenext()執行一次,
    --------若是false就跳出循環。

  • 接着,想想for(初始化語句; 判斷表達式; 每次循環後語句)的特性:

    • 通常for的初始化語句用定義一個下標變量來表示循環到哪裏?
    • 通常的Iterator遍歷,由於有next()函數因此不用着for的初始化語句
    • 因此,
    • 初始化語句能夠定義下標變量,那麼也固然能夠用來定義一個循環變量!
    • 另外,
    • Java容許賦值,那麼上文提到的遍歷Iterator的邏輯就也能夠概括for的判斷表達式中!
  • 最後,肯定for的判斷表達式

    1. 設表達式爲A
    2. 明顯地,A = hasNext(),才能正確地跳出循環。
    3. 而且,要在表達式A中完成一次賦值s=next()
    4. 運用代數邏輯,演算以下:

      A = A
      A = A && true
      true = 包含一次賦值的表達式

    5. 通常狀況,當hasNext()true時。next()不可能拋出異常或返回null
      因此,next()!=null必爲true。有:

      true = (s = next()) != null

    6. 結果以下:

      it.hasNext() && (s=(String) it.next()) != null

      等價於 A = A && true,等價於 hasxNext(),完成了一次賦值

  • 最終完整代碼:

HashMap<String, String> map = new HashMap<String, String>();
        map.put("1","a");
        map.put("2","b");
        map.put("3","c");
        map.put("4","d");

        Iterator<String> it = map.values().iterator();

        for (String s = null; it.hasNext() && (s=it.next()) != null; )
            System.out.println(s);

這樣就既能夠直接使用循環變量s, 又能夠一行寫完for語句, 實在符合個人強迫傾向的審美。
同時Java的表達式是短路表達式,一旦hasNext()返回是false,後續的(s = next()) != null操做就不會繼續執行,防止遍歷到最後next()到空值而產生異常。

  • 後記 固然,這不是什麼很厲害的代碼,也寫得很囉嗦,估計沒人能靜下心,一路看到這裏。 可是對於我來講是一次很好的邏輯整理,想出這表達只用了幾分鐘,但寫出這對文字卻用了我幾個小時(語言能力太差了)。
相關文章
相關標籤/搜索