同大多数脚本语言一样,Groovy 经常被宣传为生产力更高 的 Java 语言替代品。您已经看到了 Groovy 缺少类型能够如何减少打字工作。在这一节,将创建并试用一个 repeat
函数。在这个过程中,将进一步探索 Groovy 提高效率的方式。
更好、更短的循环
下面这种方法可以更好地感受 Groovy 缺乏类型的好处:首先,用与创建 HelloWorld
相同的方式创建一个 Groovy 类,将这个类称为 MethodMadness
,并删除自动生成的类体:将要定义一个独立的 repeat
函数。现在在控制台中输入以下代码:
def repeat(val){ |
起初,从 Java 的角度来看,这个小函数看起来可能有些怪(实际上,它很像 JavaScript)。但它就是 Java 代码,只不过是用 Groovy 的样式编写的。
深入方法
repeat
函数接受一个变量 val
。请注意参数不需要 def
。方法体本质上就是一个 for
循环。
调用这个函数。
repeat("hello |
会输出 “hello world” 五次。请注意,for
循环中省略了 int
。没有变量类型的 for
循环要比标准的 Java 代码短些。现在看看如果在代码里加入范围会出现什么情况。
Groovy 中的范围
范围 是一系列的值。例如 “0..4
” 表明包含 整数 0、1、2、3、4。Groovy 还支持排除范围,“0..<4
” 表示 0、1、2、3。还可以创建字符范围:“a..e
” 相当于 a、b、c、d、e。“a..<e
” 包括小于 e 的所有值。
循环范围
范围为循环带来了很大的方便。例如,前面从 0 递增到 4 的 for
循环如下所示:
for(i = 0; i < 5; i++) |
范围可以将这个 for
循环变得更简洁,更易阅读:
def repeat(val){ |
设置范围
如果运行这个示例,可能会注意到一个小问题:“Hello World” 输出了六次而不是五次。这个问题有三种解决方法:
- 将包含的范围限制到 4:
for(i in 0..4)
- 从 1 而不是 0 开始:
def repeat(val){
for(i in 1..5){
println val
}
}
- 将范围由包含改为排除:
def repeat(val){
for(i in 0..<5){
println val
}
}
不论采用哪种方法,都会得到原来的效果 — 输出 “Hello World” 五次。
默认参数值
现在已经成功地使用 Groovy 的范围表达式缩短了 repeat
函数。但这个函数依然有些限制。如果想重复 “Hello World” 八次该怎么办?如果想对不同的值重复不同次数 — 比如 “Hello World” 重复八次,“Goodbye Sunshine” 重复两次,这时该怎么办?
每次调用 repeat
时都要指定需要的重复次数的做法已经过时了,特别是在已经适应了默认行为(重复五次)的时候。
Groovy 支持默认参数值,可以在函数或方法的正式定义中指定参数的默认值。调用函数的程序可以选择省略参数,使用默认值。
更加复杂的参数值
使用前面的 repeat
函数时,如果希望调用程序能够指定重复值,可以像下面这样编码:
def repeat(val, repeat=5){ |
像下面这样调用该函数:
repeat("Hello World", 2) |
结果会输出 “Hello World” 两次,“Goodbye sunshine” 四次,“foo” 五次(默认次数)。