博主有较强的强迫倾向!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()
到空值而产生异常。