Effective Java 之-----for-each循环优于传统的for循环
2016-06-27 19:29
513 查看
如下代码:
这个程序不会抛出异常,而是只打印6个重复的词(从"1,1"到"6,6"),而不是预计的36中组合,
为修正这个bug,需要在外部循环的作用域中添加一个变量来保存外部变量,如下:
如果是嵌套的for-each循环,这个问题就完全消失,产生的代码就是希望得到的:
for循环不仅可以遍历数组和集合,还可以遍历任何实现Iterable接口的对象。
(for(Suit suit:suits) 等价于 for(int i=0,a=suits.size();i<a;i++))
有三种常见的情况无法使用for-each循环:
1)过滤:需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用他的remove方法;
2)转换:需要遍历列表或数组,并取代它部分或全部的元素值;
3)平行迭代:需要并行的遍历多个集合
enum Face {1,2,3,4,5,6}; ...... Collection<Face> faces = Array.asList(Face.values); for(Iterator<Face> i = faces.iterator();i.hasNext();){ for(Iterator<Face> j = faces.iterator();j.hasNext();){ System.out.println(i.next()+","+j.next()); } }
这个程序不会抛出异常,而是只打印6个重复的词(从"1,1"到"6,6"),而不是预计的36中组合,
为修正这个bug,需要在外部循环的作用域中添加一个变量来保存外部变量,如下:
for(Iterator<Face> i = faces.iterator();i.hasNext();){ Face bum = i.next(); for(Iterator<Face> j = faces.iterator();j.hasNext();){ System.out.println(i.next()+","+j.next()); } }
如果是嵌套的for-each循环,这个问题就完全消失,产生的代码就是希望得到的:
for(Suit suit: suits) for(Rank rank: ranks) deck.add(new Card(suit,rank));
for循环不仅可以遍历数组和集合,还可以遍历任何实现Iterable接口的对象。
(for(Suit suit:suits) 等价于 for(int i=0,a=suits.size();i<a;i++))
有三种常见的情况无法使用for-each循环:
1)过滤:需要遍历集合,并删除选定的元素,就需要使用显示的迭代器,以便可以调用他的remove方法;
2)转换:需要遍历列表或数组,并取代它部分或全部的元素值;
3)平行迭代:需要并行的遍历多个集合
相关文章推荐
- 剑指offer-数组中出现次数超过一半的数字
- post请求中参数为json格式
- jQuery学习之:Validation表单验证插件
- Ember.js 的视图层
- kafka broker 进入 conflicted ephemeral node 死循环
- jquery-validation 使用
- [剑指Offer] 第5章课后题详解
- 【caffe-Windows】mnist实例编译之model的生成
- jQuery图片延迟加载插件jQuery.lazyload
- html5中页面拨打电话的方式
- FastJson返回值为空时key丢失
- pom.xml文件报错:Plugin execution not covered by lifecycle..
- js实现千分符和保留几位小数
- director.js:客户端的路由---简明中文教程
- 异步I/O原理
- .NET下解析Json的方法
- css中的clip属性rect(top,right,bottom,left);
- 关于Ajax load页面中js部分$(function(){})的执行顺序
- react
- node.js 项目相关