用for/in在Java 5.0中增强循环

for/in 循环通常叫作 增强的 for 或者 foreach,它是 Java 5.0 中一个极为方便的特性。实际上它没有提供任何新的功能,但它显然能让一些日常编码任务变得更简单一些。在本文中,您将学习这方面的许多内容,其中包括使用 for/in 在数组和集合中进行遍历,以及如何用它避免不必要(或者只是令人厌烦的)类型转换。您还将学习如何实现 for/in,了解新的 Iterable 接口的一些细节,甚至还将学习如何让您自己的定制对象用这个新的构造进行遍历。最后,您将学习 for/in 不能 做什么,以确保您能理解什么时候选择原来的 for 是正确的选择。

越短越好

这是资深电脑程序员都知道的一条最基本的原理:因为 更短 意味着 打字更少,所以更短自然也就更好。这个哲学造就了 vi 这样的 IDE,在这类 IDE 中,像 :wq! 和 28G 这样的命令拥有丰富的含义。这个哲学还导致一些最神秘的代码,比如说,变量 ar 代表 Agile Runner(也可能是 Argyle,或者 Atomic Reactor 等等,总之,您明白就好)。

有些时候,在努力实现短小的时候,程序员会将明确性抛到脑后。也就是说,过于短小和过于繁冗的代码都会让人感到痛苦不堪。变量名为 theAtomicReactorLocatedInPhiladelphia 与名为 ar 的变量一样让人讨厌和不方便。一定会有一个让人高兴的解决方法,不是吗?

这个让人高兴的方法(至少我是这么认为的)是以寻找完成某事的 方便 途径为出发点,不是为了短小而短小。作为这类解决方案的一个好例子,Java 5.0 引入了新版的 for 循环,我把它称为 for/in。它也被称为 foreach,有时也叫作 增强的 for,但这些指的都是同一个构造。不管您叫它什么, for/in 都会使代码变得更简单,正如您在本文中将看到的那样。

不使用 Iterator

使用 for/in 与“普通”for 之间的最基本区别是,您不必使用计数器(通常称为 i 或 count)或 Iterator。参见清单 1,它显示了一个使用的 Iterator 的 for 循环:

清单 1. for 循环,旧式学院风格

public void testForLoop(PrintStream out) throws IOException {
  List list = getList(); // initialize this list elsewhere

  for (Iterator i = list.iterator(); i.hasNext(); ) {
   Object listElement = i.next();
   out.println(listElement.toString());

   // Do something else with this list element
  }
}

注意:如果您一直在看我写的关于 Tiger 新特性的文章(请参阅 参考资料),您就会知道,我常常感谢 O'Reilly Media, Inc.,因为它们允许我在本文中发布我其他书中的代码示例。这意味着您得到的代码已经通过了更多测试、更多评论,比我能提供给您的多得多。所以再次感谢 O'Reilly,如果您想了解 Tiger 的更多内容,请参考我撰写的一些书,它们列在 参考资源一节中,其中有完整的链接和更多的细节。

如果您期待着得到如何把这个代码转变成新的 for/in 循环的详细解释,我恐怕要让您失望。清单 2 显示了用 for/in 改写的清单 1 中的代码,您应该相当熟悉它。请参见下面代码清单,我将尽可能详细地解释 for/in 循环(但是仍然很难凑成一章)。

清单 2. 转换成 for/in

public void testForInLoop(PrintStream out) throws IOException {
  List list = getList(); // initialize this list elsewhere

  for (Object listElement : list) {
   out.println(listElement.toString());

   // Do something else with this list element
  }
}

时间: 2024-10-22 17:55:49

用for/in在Java 5.0中增强循环的相关文章

谁能解释一下java5.0中增强的for(:)循环的运行机制?

问题描述 Set<Integer> s = HashMap<Integer, String>.keySet()-------------->>>>>>>>>>>Iterator it = s.iterator();while(it.hasNext()) System.out.println(m.get(it.next()));不能保持插入HashMap的顺序输出----------->>>>&

Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制

伸缩 内容: synchronized 快速回顾 对 synchronized 的改进 比较 ReentrantLock 和 synchronized 的可伸缩性 条件变量 这不公平 结束语 参考资料 关于作者 对本文的评价 相关内容: Java 理论与实践 系列 Synchronization is not the enemy Reducing contention IBM developer kits for the Java platform (downloads) 订阅: develop

在NetBeans IDE 6.0中开发通用Java应用程序简介

本简明教程将演示如何在 NetBeans IDE 6.0 中开发 Java SE 应用程序.本教程假定您对 Java 应用程序的开发已比较熟悉.在讲解过程中,我们将演示如何通过一些 IDE 特性简化应用程序开发. 我们将开发一个单词转换应用程序,用于将多个英文单词转换为一个英文单词.生成单词的构成形式为第一个词的第一个字母.第二个词的第二个字母.第三个词的第三个字母,依此类推.该生成词称为 离合词. 建立项目 我们创建的应用程序将包含两个项目: 具有实用程序类的 java 库项目. 具有 mai

Java理论与实践: JDK 5.0中更灵活、更具可伸缩性的锁定机制

JDK 5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择.例如, java.util.concurrent.lock 中的类 ReentrantLock 被作为 Java 语言中 synchronized 功能的替代,它具有相同的内存语义.相同的锁定,但在争用条件下却有更好的性能,此外,它还有 synchronized 没有提供的其他特性.这是否意味着我们应当忘记 synchronized ,转而只用 ReentrantLock 呢?并发性专家 Brian Goetz 刚从他的夏

api-vfp6.0中需要调用java编写的网页

问题描述 vfp6.0中需要调用java编写的网页 vfp6.0中需要调用java编写的网页,需要用api调用,但是vfp调用api的代码找不到,请问怎么调用java,项目时间紧张,不考虑代码改写,谢谢 解决方案 http://blog.csdn.net/feiyafei2008/article/details/2877941 解决方案二: C++编写动态链接库供VFP调用VFP编写DLL,并调用VFP编写DLL

关于java判断oracle中的表是否存在,不存在则创建一个表的问题

问题描述 关于java判断oracle中的表是否存在,不存在则创建一个表的问题 代码如下try{ Class.forName(""oracle.jdbc.driver.OracleDriver""); String url = ""jdbc:oracle:thin:@""+localhost+"":""+port+"":""+dbname; con

Jsdk5.0中新增枚举enum类型使用例解

js 作者:Junsan Jin 日期:2005-03-25 邮箱:junsan21@126.com ; junnef21@sohu.com Jsdk5.0中新增了很多的特性,如泛型.增强的循环.改进的装.拆箱.静态引入等,大大增强了java语言的易用性. 我现在正在做一个从com+(dcom)平台到j2ee平台移植的项目,中间有很多枚举类型的定义,以前做起来要引入第三方类库,或者自己写类库,或者干脆定义成静态变量使用,很不方便,而且可能会产生很多问题.Jsdk5.0的发布正好解决了这些问题.

在Framework4.0中如何实现延迟加载

延迟加载,亦称延迟实例化,延迟初始化等,主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载.这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等.针对于这种做法,似乎称之为即用即创建更为合适些. 先来看一下在Framework4.0中如何实现延迟加载. Framework4.0提供了一个包装类 Lazy,可以轻松的实现延迟加载. ///这行代码表明:要创建一个延迟加载的字符串对象s   ///原型为LazyT> 对象名=new LazyT

Java 编程技术中汉字问题的分析及解决(转)

编程|汉字|解决|问题 Java 编程技术中汉字问题的分析及解决 段明辉自由撰稿人2000 年 11月 8日内容: 汉字编码的常识 Java 中文问题的初步认识 Java 中文问题的表层分析及处理 Java 中文问题的根源分析及解决 Java Servlet 中文问题的根源 修改 Servlet.jar 中文乱码的处理函数 参考资料 作者简介在基于 Java 语言的编程中,我们经常碰到汉字的处理及显示的问题.一大堆看不懂的乱码肯定不是我们愿意看到的显示效果,怎样才能够让那些汉字正确显示呢?Jav