官方说明如下:
Groovy中的闭包是一个开放的、匿名的代码块,可以接受参数、返回结果。闭包可以引用在其周围范围中声明的变量。与闭包的形式定义相悖,Groovy语言中的闭包还可以包含在其范围之外定义的变量。
闭包是代码块
由于闭包是一个代码块,所以,定义一个闭包,可以用以下形式:
// 无参数
{ println 'hello Closures!' }
// 有参数
{ name -> println name }
// 多个参数
{ String x, int y ->
println "hey ${x} the value is ${y}"
}
调用一个闭包,可以使用call(),或直接使用名称,如下:
// 输出 hello Closures!
def clos = {println 'hello Closures!'}
clos.call()
// 两次都会输出 hello yawn!
def clos2 = { name -> println name }
clos2.call('hello yawn!')
clos2('hello yawn!')
闭包的参数
闭包的参数,可以使用it
或者显式声明参数,如下:
// it 参数
def clos3 = { println it }
clos3.call('hello yawn!')
// 声明参数(由于可以进行参数推断,所以可以不声明参数类型)
def clos4 = { name -> println name }
clos4.call('hello yawn!')
闭包的返回值
闭包也可以返回结果,实例如下:
// 闭包返回结果
def clos2 = { return ++it}
println clos2(128) // 结果为 129
闭包常用于遍历
闭包可以传递给方法,方法内部可进行调用,集合的遍历使用闭包也非常方便,如下:
// 闭包用于遍历
def arrs = [1, 2, 3, 4, 5, 6]
arrs.each { println(it) }
arrs.each { item -> println(item) }
// map 遍历
def map = ["id": 1, "name": "yawn", "age": 18]
map.each { println it }
Groovy中闭包可以引用在其周围范围中声明的变量
Groovy中闭包可以引用在其周围范围中声明的变量,且对变量的修改会生效,并不像函数中的值传递。
// Groovy中闭包可以引用在其周围范围中声明的变量
def num = 0 // 声明变量为 0
def clos = {++num} // 闭包中引用
clos.call() // 调用闭包
println num // 打印原变量,结果为 1
小结
所以,闭包是一段代码块,与js中的函数、java中的lambda表达式类似,可以作为参数传给方法,常用于集合的遍历。Groovy中的闭包,能够对代码块外的变量进行操作,并改变其值。