闭包使用的坑

函数有很多闭包的使用,闭包可以说是把双刃剑,闭包本身是一种面向抽象编程,屏蔽细节的设计原则。在良好的设计下,可以通过闭包来屏蔽对于环境信息的感知,从而简化外部对于系统理解的成本,提高系统的易用性。
闭包是由函数和与其相关的引用环境(方法外变量)组合而成的实体。
我有一个方法A,其中有私有变量。我想在别的方法中可以直接访问并使用它,但是又不想直接暴露它。这时候,就可以在A建立一个内部类B来访问私有变量。那么这时候,这个内部类中你所可以访问B的方法,就和A中的私有变量形成了闭包。此时B已经捕获了A中的变量。即便是A对象销毁了,被B捕获的私有变量仍然不会释放。所以可以理解,如果希望系统方法和当前环境的上下文绑定的话,就可以使用闭包。
1. 闭包写代码块,闭包只是一个语句,用大括号包含,然后像常规方法一样调用闭包
def c = { log.info("hello") } c()
2. 多个例子带你明白闭包用法
def c = {String name,int len-> return name.length() > len } c("name",2) //true //其实我们常用的遍历也是闭包,只不过遍历的时候可以把()省略 def names = ["zhangan","lisi","wangwu"]  names.each({ String name -> log.info(name) })    names.each{name-> log.info(name)}
3. groovy的函数支持不定长参数,
def print(...param){ log.info(param[1]) } print("hello","world")
4. 闭包可以作为参数传递给另一个闭包
def times = {int x -> { int y -> x * y } } times(3)(4)//12
5. 观察下图,errorMessage有两个,如果闭包内外都有同一个变量的话,还是优先使用外面的,所以即使给里面的赋值,里面的也是null,故而报错,所以在书写ValidateResult或者WebAction的时候要注意,里面的变量和外面变量的不能一样,另外,推荐大家使用文档示例,文档上的非闭包形式,不推荐大家用闭包写法。一切以文档为准
2023-02-13
0 0