for(String language: list2){
System.out.println("I know " + language);
}
}
}
因此,您可以使用相同的方法遍历数组和集合(
Map 除外)。但是如果语言存储在 java.io.File,那该怎么
办?如果存储在 JDBC
ResultSet,或者存储在 XML 文档、java.util.StringTokenizer 中呢?
面对每一种情况,必须使用一种稍有不同的迭代策略。这样做并不是有什么特殊目的 — 而是因为不同的 API 是由
不同的开发人员在不同的时期开发的 — 但事实是,您必须了解 6 个 Java 迭代策略,特别是使用这些策略的特殊
情况。
Eric S. Raymond 在他的 The Art of Unix Programming(参见 参考资料
)一书中解释了 “最少意外原则”。他
写道,“要设计可用的接口,最好不要设计全新的接口模型。新鲜的东西总是难以入门;会为用户带来学习的负担,因
此应当尽量减少新内容。”Groovy 对迭代的态度正是采纳了 Raymond 的观点。在 Groovy 中遍历几乎任何结构
时,您只需要使用
each() 这一种方法。
Groovy 中的列表迭代
首先,我将 清单 3
中的 List 重构为 Groovy。在这里,只需要直接对列表调用 each() 方法并传递一个闭
包,而不是将
List 转换成 for 循环(顺便提一句,这样做并不是特别具有面向对象的特征,不是吗)。
创建一个名为 listTest.groovy 的文件并添加清单 4 中的代码:
清单 4. Groovy 列表迭代
def list = ["Java", "Groovy", "JavaScript"]
list.each{language->
println language
}
清单 4 中的第一行是 Groovy 用于构建
java.util.ArrayList 的便捷语法。可以将 println
list.class
添加到此脚本来验证这一点。接下来,只需对列表调用 each(),并在闭包体内输出
language 变量。在闭包的开始处使用 language-> 语句命名 language 变量。如果没有提供变量名,
Groovy 提供了一个默认名称
it。在命令行提示符中输入 groovy listTest 运行 listTest.groovy。
清单 5 是经过简化的 清单 4
代码版本:
清单 5. 使用 Groovy 的
it 变量的迭代
// shorter, using the default it variable
def list = ["Java", "Groovy", "JavaScript"]
list.each{ println it }
回页首