博主有較強的強迫傾向!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());
s
能夠直接使用,不用擔憂屢次調用next()
產生錯誤。for(String s:it)//這樣是錯的,不支持。 System.out.println(s);
因此做爲一個有強迫傾向的人, 但願找到一種接近上述特性的寫法。it
天無絕人之路,for循環
Java語言有一個我很喜歡的特性————容許在表達式中賦值
!
流的IO讀寫操做就是一個十分典型的應用。變量
經驗告訴我,只要利用這個特性就能實現個人目的:循環
首先,明確Iterator通常是怎麼遍歷的。遍歷
hasNext()
和next()
函數互相配合遍歷的。hasNext()
判斷是否存在下個對象。next()
則返回下個對象並移動遊標到下下個對象。根據上述特性概括一下,上述邏輯等價於:map
每次循環
----hasNext()
判斷
--------若是true
則next()
執行一次,
--------若是false
就跳出循環。
接着,想想for(初始化語句; 判斷表達式; 每次循環後語句)
的特性:
for的初始化語句
用定義一個下標變量
來表示循環到哪裏?通常的Iterator遍歷
,由於有next()
函數因此不用着for的初始化語句
。初始化語句
能夠定義下標變量
,那麼也固然能夠用來定義一個循環變量
!賦值
,那麼上文提到的遍歷Iterator的邏輯
就也能夠概括for的判斷表達式
中!最後,肯定for的判斷表達式
:
A
。A
= hasNext()
,才能正確地跳出循環。A
中完成一次賦值s=next()
。運用代數邏輯,演算以下:
A = A
A = A &&true
true
= 包含一次賦值的表達式
通常狀況,當hasNext()
爲true
時。next()
不可能拋出異常或返回null
因此,next()!=null必爲true
。有:
true
=(s = next()) != null
結果以下:
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()
到空值而產生異常。