【代码优化】for-each代替普通的for循环或者while循环
对于集合的遍历首选方法是for-each
for(Element e :c){doSomething(e);}
这是1.5版本之后的做法;java1.5之前使用的是Iterator迭代器。
为了弄清楚为啥比普通的for循环或者whlie循环好,请看一下代码
Iterator<Element> i=c.iterator();while(i.hasNext()){doSomething(i.next());}Iterator<Element> i2=c.iterator();while(i.hasNext()){//bug 不应该调用idoSomething(i2.next());}
上面的bug是因为我们经常拷贝相同结构的代码,但是变量使用在作用域类,不会在编译时发现,运行就会出问题。
对于for循环就不会出现这个bug,第一个for循环的变量不能用到同一个方法的第二个for循环中,否则编译出错,
这也看出for循环要强于while循环。
对于多重循环迭代时候,就算是老程序员也容易患一个错误。
例子:用扑克牌例子Card表示牌对象,suit花色,rank点数
Collection<suit> suits=Arrays.asList(Suit.values);Collection<rank> ranks=Arrays.asList(Rank.values);List<card> cards= new ArrayList<Card>();for (Iterator<Suit> i=suits.iterator(); i.hasNext()){for (Iterator<Rank> j=ranks.iterator(); j.hasNext()){cards.add(new Card(i.next,j.next));//注意}}
发现上面的问题了吗??很多老程序员都会患这种错误,不要说新手了,
cards.add(new Card(i.next,j.next));
只能得到 j 条数据,而不是我们想要的 i * j 条数据。
正确的做法是这样的
Collection<suit> suits=Arrays.asList(Suit.values);Collection<rank> ranks=Arrays.asList(Rank.values);List<card> cards= new ArrayList<Card>();for (Iterator<Suit> i=suits.iterator(); i.hasNext()){ Suit suit=i.next();//加上这个,i 的循环不应该放到 j 中做for (Iterator<Rank> j=ranks.iterator(); j.hasNext()){cards.add(new Card(suit,j.next));//注意}}然后对于for-each就不用担心双重,多重迭代了,直接使用多重for-each就可以方便的解决了,也不会出现上面的bug<pre name="code" class="html"> for(Suit s : suits ){for(Rank r: ranks){cards.add(s, r);}
}
就这么简单,可以看出for-each强于普通的for循环和while循环了吧。
注意:
不过for-each在下列3种情况下不能使用:
- 过滤——如果需要迭代集合,并且删除选定元素,就需要使用显示迭代器,才可以调用remove方法
- 转换——如果需要遍历列表或者数组,并修改取代列表中的部分元素,就不合适了。
- 平行转换——需要并行的遍历多个集合,就需要显示的控制迭代器或者索引变量。
【代码优化】for-each代替普通的for循环或者while循环相关推荐
- python循环指令_Python循环
布尔运算 学习循环之前,先了解一个概念:布尔运算 布尔运算是数字符号化的逻辑推演法,包括联合.相交.相减.在图形处理操作中引用了这种逻辑运算方法以使简单的基本图形组合产生新的形体,并由二维布尔运算发展 ...
- python编程循环语句_循环语句—Python编程从入门到精通(5)
第6章.循环语句 在本书上一章的内容中,我们学习了实现条件判断功能的条件语句,让程序的执行顺序发生了变化.为了满足循环和跳转等功能,本章将详细讲解Python语言中循环语句的知识,主要包括for循环语 ...
- Java变量声明在循环体内还是循环体外,你用哪一个?
作者 | java金融 来源 | java金融(ID:java4299) 头图 | CSDN 下载自东方IC 引言 最近刷知乎的时候看到一个比较有意思的问题,变量声明在循环体内还是循环体外?这个问题 ...
- python无限循环和遍历循环,python中什么叫遍历
python循环语句是什么? python 循环语句:while 判断条件(condition):执行语句(statements)--执行语句可以是单个语句或语句块. 判断条件可以是任何表达式,任何非 ...
- java for循环_Java for循环语句
Java for循环语句 在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句.一组被重复执行的语句称之为循环体,能否继续重复,取决于循环的终止条件.循环结构是在一定条件下反 ...
- 循环链表详解(循环单链表/循环双链表)
目录 一.循环单链表 二.循环双链表 一.循环单链表 循环单链表的表尾结点的next指针总是指向头结点. 所以在初始化循环单链表的时候,需要记得将头结点的next指针指向头结点自己: 判断循环单链表 ...
- python循环语句for 循环十次_python循环语句for循环十次
python的for循环语句怎么写 for循环列表操作方法 >>>a = [1,2,3,4] >>>for i in a: >>> print i ...
- python哨兵循环_Python通用循环的构造方法实例分析
本文实例讲述了python通用循环的构造方法.分享给大家供大家参考,具体如下: 1.交互循环 是无限循环的一种,允许用户通过交互的方式程序的特定部分: def main(): sum =0.0 cou ...
- java循环使用范围_Java循环流程控制语句
7 循环流程控制语句 7.1 for循环的格式及基本使用 7.1.1 for循环语句格式: for(初始化语句;判断条件语句;控制条件语句){ 循环体语句; } 7.1.2 循环的执行流程图: 案例: ...
- python当型循环_对python while循环和双重循环的实例详解
废话不多说,直接上代码吧! #python中,while语句用于循环执行程序,即在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务. #while是"当型"循环结构. i ...
最新文章
- perl: warning: Setting locale failed. Falling back to a fallback locale (“en_HK.UTF-8“).
- python utc时间转换为strftime
- 架构风格:万金油CS与分层
- 【Paper】2021_Observer-Based Controllers for Incrementally Quadratic Nonlinear Systems With Disturbanc
- Android中添加背景音乐的两种方法
- calayer 与uiview
- 局域网聊天9月局域网聊天
- JDK可视化工具 | JConsole操作指南,手把手教会你
- spring cloud微服务分布式云架构-commonservice-config配置服务搭建
- nginx 获取body参数_日志分析系列(外传二):Nginx日志统一化
- WDM驱动程序介绍(引)
- 【redis】redis实用Utils
- 详解SpringCloud中RabbitMQ消息队列原理及配置,一篇就够!
- 三极管饱和时内部状态再探
- 用于分类的神经网络算法,图像识别神经网络算法
- 遗传算法python与matlab_遗传算法之Python实现代码
- 获奖团队访谈录|“AI+无线通信”赛道三等奖团队
- 【玩转微信公众平台之二】 账号注册
- 比 Redis 还快,更省内存,开源,惊爆了!
- centos7搭建discuz论坛过程
热门文章
- 【14年浙江省赛 F ZOJ 3781】Paint the Grid Reloaded 【建图、bfs】
- 由线性空间V中的集合生成的子空间
- oracle数据库第十一章答案,[转载]《互联网数据库》网上作业练习题10-11章答案...
- JS 数组reduce()方法详解及高级技巧
- 基于线程池技术的web服务器
- How to deploy Odoo 11 on Ubuntu 18.04
- NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头
- CSS实现文字半透明显示在图片上方法
- Openstack Nova network
- OD使用教程23 - 调试篇23