foreach 循环详解
2016-09-20 09:51
357 查看
译自:http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html
考虑如下代码(方式一):迭代一个 collection 集合对象,然后删除集合元素
结构),它摒弃了这种丑陋。
利用方式一迭代 collection 集合对象 通常犯的错误,荔枝代码如下:
为什么报错? 当 ranks 的size 大于 suits.size 的时候,第3行中的 i.next() 就会抛出 NoSuchElementException 异常。
修改后的代码如下(利用临时变量 保存Suit实例,但代码还是那么杂乱无章):
我们看foreach 结构如何实现
等等 foreach结构还可以应用到数组的遍历
最后:我们什么时候不能用 foreach结构 迭代集合元素呢?
case1:程序需要访问迭代器 然后移除当前元素的时候;因为foreach 结构隐藏了 迭代器,所以无法调用remove() 方法;
case2:foreach 结构不适用于 过滤 同样也不适用于 遍历过程中替换元素的操作。
case3:最后,foreach结构 不适用于同时并行遍历 多个 集合元素。
虽然 foreach结构有以上缺点,但是它的应用可以覆盖掉大多数的情况需要。
考虑如下代码(方式一):迭代一个 collection 集合对象,然后删除集合元素
void cancelAll(Collection<TimerTask> c) { for (Iterator<TimerTask> i = c.iterator(); i.hasNext(); ) i.next().cancel(); }以上迭代方式很丑陋,你知道,为什么丑陋?你看迭代器i 出现了3次,增加了我们出错几率,而且代码如此杂乱,我们看如下代码(方式二foreach
结构),它摒弃了这种丑陋。
void cancelAll(Collection<TimerTask> c) { for (TimerTask t : c) t.cancel(); }
利用方式一迭代 collection 集合对象 通常犯的错误,荔枝代码如下:
List suits = ...; List ranks = ...; List sortedDeck = new ArrayList(); // BROKEN - throws NoSuchElementException! for (Iterator i = suits.iterator(); i.hasNext(); ) for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(i.next(), j.next()));
为什么报错? 当 ranks 的size 大于 suits.size 的时候,第3行中的 i.next() 就会抛出 NoSuchElementException 异常。
修改后的代码如下(利用临时变量 保存Suit实例,但代码还是那么杂乱无章):
// Fixed, though a bit ugly for (Iterator i = suits.iterator(); i.hasNext(); ) { Suit suit = (Suit) i.next(); for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(suit, j.next())); }
我们看foreach 结构如何实现
for (Suit suit : suits) for (Rank rank : ranks) sortedDeck.add(new Card(suit, rank));
等等 foreach结构还可以应用到数组的遍历
// Returns the sum of the elements of a int sum(int[] a) { int result = 0; for (int i : a) result += i; return result; }
最后:我们什么时候不能用 foreach结构 迭代集合元素呢?
case1:程序需要访问迭代器 然后移除当前元素的时候;因为foreach 结构隐藏了 迭代器,所以无法调用remove() 方法;
case2:foreach 结构不适用于 过滤 同样也不适用于 遍历过程中替换元素的操作。
case3:最后,foreach结构 不适用于同时并行遍历 多个 集合元素。
虽然 foreach结构有以上缺点,但是它的应用可以覆盖掉大多数的情况需要。
相关文章推荐
- smarty手册-smarty中foreach循环语句详解
- smarty手册-smarty中foreach循环语句详解
- Smarty foreach控制循环次数的实现详解
- 【转】PHP中foreach循环详解
- Java中的foreach循环遍历详解
- PHP循环语句详解 while, for, foreach, do while
- smarty循环foreach,section实例详解
- smarty循环foreach,section实例详解
- PHP中foreach循环用法详解
- foreach循环详解
- PHP循环语句详解 while, for, foreach, do while
- C# foreach循环实例详解
- Smarty foreach控制循环次数的实现详解
- Java中的foreach循环遍历详解
- 详解Java中的增强 for 循环 foreach
- ecshop模板循环foreach的使用方法及参数详解
- PHP中foreach循环详解 推荐
- Javascript数组循环遍历之forEach详解
- PHP中foreach循环详解
- PHP循环语句详解 while, for, foreach, do while