|
封闭闭包(closure)
闭包的语法发生了变化,但是大多数变化只与参数有关。在经典的 Groovy 中,如果为闭包声明参数,就必须用 | 字符作为分隔符。您可能知道,| 也是普通 Java 语言中的位操作符;结果,在 Groovy 中,只有在某个闭包的参数声明的上下文中,才能使用 | 字符。
在“alt.lang.jre: 感受 Groovy”的清单 21 中,我演示了迭代,查看了用于闭包的经典 Groovy 参数语法。可以回想一下,我在集合上运用了 find 方法,该方法试图找到值 3。然后我传入了参数 x,它代表 iterator 的下一个值 (有经验的 Groovy 开发人员会注意到,x 完全是可选的,我可以引用隐式变量 it)。使用 JSR Groovy 时,必须删除 | ,并用 Nice 样式的 -> 分隔符代替它,如清单 5 所示:
清单 5. 新的 Groovy 闭包语法
[2, 4, 6, 8, 3].find { x ->
if (x == 3){
println "found ${x}"
}
}
新的闭包语法有没有让您想起 Nice 语言的块语法呢?如果不熟悉 Nice 语言,请参阅 alt.lang.jre: Nice 的双倍功能,这是我在 alt.lang.jre 系列上贡献的另一篇文章。
正如我在前面提到过的,Groovy 的 JDK 没有变。但是就像刚才所学到的,闭包却发生了变化;所以,使用 Groovy 的 JDK 中那些漂亮的 API 的方式也发生了变化,但仅仅是轻微的变化。在清单 6 中,可以看到这些变化对 Groovy IO 的影响根本是微不足道的:
清单 6. Groovy 的 JDK 依旧功能强大!
import java.io.File
new File("maven.xml").eachLine{ line ->
println "read the following line -> " + line
}
改编过滤器
现在,不得不让您跳过很大一部分,但您还记得在“用 Groovy 进行 Ant 脚本编程”一文中,我是如何介绍闭包的威力和工具的吗?谢天谢地,我在这个专栏的示例中所做的多数工作都很容易针对新语法重新进行改编。在清单 7 中,我只是将 @Property 属性添加到 Filter 的成员 strategy(最初在那篇文章的清单 2 和清单 3 中显示)。然后在闭包中添加 -> 分隔符,万岁 —— 它可以工作了!
清单 7. 过滤改编!
package com.vanward.groovy
class Filter{
@Property strategy
boolean apply(str){
return strategy.call(str)
}
}
simplefilter = { str ->
if(str.indexOf("java.") >= 0){
return true
}else{
return false
}
}
fltr = new Filter(strategy:simplefilter)
assert !fltr.apply("test")
assert fltr.apply("java.lang.String")
rfilter = { istr ->
if(istr =~ "com.vanward.*"){
return true
}else{
return false
}
}
rfltr = new Filter(strategy:rfilter)
assert !rfltr.apply("java.lang.String")
assert rfltr.apply("com.vanward.sedona.package")
目前为止还不坏,您觉得呢?新的 Groovy 语法很容易掌握! |
|