7. Groovy的控制结构
要理解groovy的控制结构,首先要明白其布尔值的判定。groovy借鉴了很多脚本语言,把数字0,空字符串,空集合等判定为false,除此之外null对象为false。
7.1 swith语句
groovy的swith语句支持很多类型,如下面的例子,实际上是调用了case条件中对象的isCase()方法,这里列举了以下实现isCase()方法的对象(注释中的是isCase()具体实现),你可以自定义改方法。
switch (10) {
case 0: println '==0'; break // Integer.equals(10)
case 0..9: println '[0,9]'; break // Range.contains(10)
case [8, 9, 11]: println 'in [8, 9, 11]'; break // Collections.contains(10)
case Float: println 'is Float'; break // 10 instanceof Float
case { it % 2 == 1 }: println 'odd'; break // Closure.call(10)
case ~/\d\s/: println "match /\\d\\w/"; break // Regular.matcher(10.toString()).matches(), Note: 10.toString() is called
case '10': println 'is string 10'; break // String.equals(10.toString(); Note: 10.toString() called
default: println 'nothing'; break
} // output: is string 10
注意:如果没有break,即使case条件为false,后面的println语句也会执行。
另外集合的grep方法也用isCase()方法取交集
7.2 循环
groovy里有for和while循环,没有do-while。
groovy的for可以遍历实现Iterable的类,已知的有:range/collection/map/array/iterator/enumeration。
除此之外,for还可以遍历一个文件的行,正则表达式的匹配项,一个对象,甚至是null(不会报错,当然也不会循环)
file = new File(/H:\programs\grails-2.2.3\INSTALL/)
for (line in file) {
println line
}
for (n in null) {
println 'this won\'t happen'
}
for (n in 10) {
println n // output: 10
}
7.3 break,continue,return
这几个中断代码执行的逻辑和java一样,稍微要注意的是return在闭包中是可以省略的,默认返回最后一个表达式的结果,如果最后一个表达式没返回值,则返回null,另外就是循环中只是本轮循环结束,循环会继续。
7.4 try-catch-finally
异常捕获和java中是相同的。