闭包_是groovy语言的一个声明函数的方式. 它有2个非常有趣的特性:
一是:是一个值(像一个string,number一样)可以赋给一个变量
二是:在其类部可以使用可触及范围内声明的变量
1.声明闭包
task groovy {}
def foo = "One million dollars"
def myClosure = {
println "Hello from a closure"
println "The value of foo is $foo"
}
myClosure() // 调用与函数调用一样
def bar = myClosure // 又是一个值,可以赋值给变量
def baz = bar
baz()
2.对于参数,闭包有另一种表示方式
def doubleIt = { x -> x + x}
3.groovy语言是允许高阶式函数编程,即可以将一个函数作为参数坐传递给别一个参数
def applyTwice(func, arg){
func(func(arg))
}
foo = 5
def fooDoubledTwice = applyTwice(doubleIt, foo)
println "Applying doubleIt twice to $foo equals $fooDoubledTwice"
4.对于List列表groovy有自己非常简单处理方式-用闭包
def myList = ["Gradle", "Groovy", "Android"] // 声明一个list数据集
def printItem = {item -> println "List item: $item"} // 定义一个闭包,打印list中的每一个item元素
myList.each(printItem) // list.each(closure)函数 接受一个闭包
当然,我们还可以更加简化这种表示方式,声明闭包在一行里,去除两个大括号,除此之外
如果一个闭包接受的是单个参数的话,默认情况,这个参数名称用"it"表示,如下简化上例打印list的表示方式
myList.each{println "Compactly printing each list item: $it"}
5.类的声名:groovy声名一个类有非常简单的语法,groovy声明的类底层本质上就是java class,而groovy会自动为其class的属性会自动生成getter和setter方法
class GroovyGreeter {
String greeting = "Default greeting"
def printGreeting(){println "Greeting: $greeting"}
}
def myGroovyGreeter = new GroovyGreeter()
myGroovyGreeter.printGreeting()
myGroovyGreeter.greeting = "My custom greeting"
myGroovyGreeter.printGreeting()
6.groovy的最后一个特性是闭包可以有一个代理对象.任何在闭包中没有在本地定义的变量或方法,可以通过代理对象进行赋值
def greetingClosure = {
greeting = "Setting the greeting from a closure"
printGreeting()
}
// greetingClosure() // This doesn't work, because `greeting` isn't defined
greetingClosure.delegate = myGroovyGreeter
greetingClosure() // This works as `greeting` is a property of the delegate
更多资料,如下连接
http://learnxinyminutes.com/docs/groovy/
http://www.groovy-lang.org/documentation.html