理解闭包,要从函数参数
和函数功能
的角度去理解。
闭包可以应用在装饰器(python)、函数式编程、回调式异步编程上。
函数(方法)参数,表明该函数能够处理的数据类型,确切点说,是能够处理的数据的种类和数量,跟在函数名后面。在闭包出现之前,函数接受的参数形式有:变量
、表达式
、函数的返回值
。总之,是一个确定的值。在闭包出现以后,参数就多了一个表现形式:代码块
,也就是所谓的闭包参数
,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
}