Groovy代码示例 – 闭包closure
groovy闭包closure
闭包就是带有参数、返回值并且能被赋值给变量的匿名代码块 。Groovy中的闭包能够访问闭包外部定义的变量。在闭包传统定义的基础上,Groovy扩展了一些特性。通过这些特性的支持,我们可以把闭包作为函数参数,在函数内调用匿名的代码块,从而写出更加动态的代码,等等。接下来看看groovy闭包的代码示例。
//定义一个闭包
def myClosure = {
println "Hello World!"
}
//执行闭包方式1
myClosure.call() // Hello World!
//执行闭包方式2
myClosure() // Hello World!
闭包的参数
有时候,我们需要传递参数给闭包从而实现更加灵活的满足我们的需求。你可以编写具有带有参数的闭包,然后调用。下面是代码示例。
//it为内置参数
def squareWithImplicitParameter = { it * it }
//调用闭包
println squareWithImplicitParameter(4) // 16
//定义了a,b两个参数,都声明为int
def sumWithExplicitTypes = { int a, int b -> return a + b }
println sumWithExplicitTypes(11, 8) // 19
//定义了a,b两个参数,并且声明了a的类型为int
def sumWithOneExplicitOneOptionalTypes = { int a, b -> return a + b }
println sumWithOneExplicitOneOptionalTypes(20, 13) // 33
//定义了a,b两个参数,并且设定b的默认值为5,如果调用闭包时没有提供第二个参数,则默认为5
def sumWithDefaultParameterValue = { a, b = 5 -> return a + b }
println sumWithDefaultParameterValue(4) // 9
闭包closure的变长参数varargs
可以为闭包定义一个变长的参数,下面是代码示例:
//定义一个变长参数String... names,然后将参数用逗号连接
def combine = { String... names ->
names.join(',')
}
println combine('John', 'Doe', 'Betty') // John,Doe,Betty
闭包作为参数
groovy支持闭包作为参数传递给函数或其他闭包
//定一个闭包,其中第二个参数为另外一个闭包
def funcClosure = { x, func ->
//执行传入的闭包
func(x)
}
//{it.size()} 是一个闭包
println funcClosure([1, 2, 3], { it.size() }) // 3
//等价于
def anotherClosure = {
it.size()
}
println funcClosure([1, 2, 3], anotherClosure) // 3
闭包的组合
groovy闭包支持组合,通过闭包的组合实现重用并建立更加复杂的闭包
//定义一个加法闭包
def sum = { a, b -> return a + b }
//定义一个计算面积的闭包
def square = { it * it }
//组合闭包形成新的闭包,将sum闭包作为参数传递给square闭包
def squareOfSum = square << sum
//相当于{ { a, b -> return a + b } * { a, b -> return a + b }}
println squareOfSum(2, 3) // 25
groovy中如何从闭包.each{Closure} 中断执行并退出?
groovy中的集合可以执行.each{Closure}闭包,这个闭包本身是不支持中途退出(除非抛出异常,一般不建议这样设计)。但是我们还可以使用其他替代的闭包来达到相同的目标,如下:
find闭包
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // 退出遍历
println it // 执行遍历操作
return false // 继续遍历
}
或者any闭包
def list = [1, 2, 3, 4, 5]
list.any { it ->
if (it == 2)
return // 继续执行
println it
if (it == 3)
return true //退出
}
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/05/06/groovy-code-example-closure/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论