闭包Closures和闭包的特性

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2020/12/bibao-closures.html

官方说明如下:

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中的闭包,能够对代码块外的变量进行操作,并改变其值。

发表评论