美文网首页
一篇文章理解groovy中闭包closure的使用,不仅仅限于g

一篇文章理解groovy中闭包closure的使用,不仅仅限于g

作者: ag4kd | 来源:发表于2018-12-19 16:24 被阅读0次

理解闭包,要从函数参数函数功能的角度去理解。

函数(方法)参数,表明该函数能够处理的数据类型,确切点说,是能够处理的数据的种类和数量,跟在函数名后面。在闭包出现之前,函数接受的参数形式有:变量表达式函数的返回值。总之,是一个确定的值。在闭包出现以后,参数就多了一个表现形式:代码块,也就是所谓的闭包参数,closure。
函数功能:表明函数能够做什么及怎么做。

闭包,则把这二者(参数和函数体)结合起来,来实现动态化函数的功能,即参数化函数的能力,广义来讲,就是参数化函数体
闭包的出现,其实是对函数本身的能力的一种增强、升级,或者说是扩展和优化,当然,函数重载和函数的重写也是一种函数能力的强化。
提一种需求:

1、打印一个列表的所有元素
2、打印一个列表的所有元素与10的和

这里只讲groovy的实现方式,什么C啦 、C++啦、Java啦,JS啦、Python啦,kotlin啦、OC啦,这里都不讲,不过,熟悉JS的朋友,对闭包应该比较了解。

groovy的实现方式

闭包的声明:在定义方法的时候。一般放在参数列表的最后一个位置,原因,你理解groovy的方法与其他语言的差异就明白了。

//定义要处理的数据
def list = [1, 2, 3, 4, 5, 6] 
//处理数据的方法,同时声明一个闭包作为参数
def method(list,closure) {
    list.each {
        closure(it)//闭包调用
    }
}

闭包的定义:在函数调用的时候。这一点特别能体现辩证唯物主义哲学上所说的矛盾特殊性原理的一个方法论:具体问题具体分析。此处,总结一句话: 闭包调用,也是定义!

闭包的调用:在函数体内

需求1的实现:函数调用的同时,定义闭包的具体能力:打印一个列表的所有元素
method (list){
    println it
}

或者,你会说:“这不就是把list逐个打印出来么”,你说的对!那么我想再实现一种方式呢,比如list中,每一个元素加10,当然你可以再定义一个方法,即前面提到的函数的重载,在groovy的世界里,你没必要那么做,因为你有了闭包这个参数.

需求2的实现:函数调用的同时,定义闭包的具体能力:打印一个列表的所有元素与10的和
method (list){
    println it + 10
}

下面是完整代码:

def list = [1, 2, 3, 4, 5, 6]
def method(list,closure) {
    list.each {
        closure(it)
    }
}

method (list){
    println it
}
method (list){
    println it + 10
}
image.png

相关文章

网友评论

      本文标题:一篇文章理解groovy中闭包closure的使用,不仅仅限于g

      本文链接:https://www.haomeiwen.com/subject/abbdkqtx.html