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全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Groovy代码示例 – 闭包closure
groovy闭包closure 闭包就是带有参数、返回值并且能被赋值给变量的匿名代码块 。Groovy中的闭包能够访问闭包外部定义的变量。在闭包传统定义的基础上,Groovy……
<<上一篇
下一篇>>
文章目录
关闭
目 录