Groovy的闭包
Groovy的闭包
不战则亡 发表于3年前
Groovy的闭包
  • 发表于 3年前
  • 阅读 76
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

什么是闭包

一个Groovy闭包就像一个"代码块"或函数指针。它是一个代码片段的定义和执行。它拥有一些像隐含变量一样的特定属性,用来支持currying和和自由变量(后面我们会提到)。下面我们先忽略细节,看一下下面的简单例子。

简单例子

<pre class="brush:groovy"> def clos = { println "hello!" }

println "Executing the Closure:" clos()
</pre> 上述的闭包是在被调用的时候执行,而不是定义的时候。

参数

闭包的参数位于-&gt;标志前面,如下: <pre class="brush:groovy"> def printSum = { a, b -> print a+b } printSum( 5, 7 ) //prints "12" </pre> -&gt;标志是可选的,在参数少于2个的时候可以被省略。

参数说明

一个像{}的不包含-&gt;标志的闭包其实是有一个隐含参数的,这个参数名是it。在有些情况下你必须构造一个没有参数的闭包,比如使用GString模板,定义EMC属性等等,你必须用{ -&gt; }明确的定义你的闭包,而不是用{}
你当然也可以使用可变参数, 具体请参考正式指南。模拟javascript风格的动态参数,请参阅非正式指南

自由变量(Free Variables)

闭包可以引用变量未列出的参数列表。这样的变量被称之为自由变量(Free Variables),他们被“绑定”在变量定义的范围之内: <pre class="brush:groovy"> def myConst = 5 def incByConst = { num -> num + myConst } println incByConst(10) // => 15 </pre> 另外一个例子: <pre class="brush:groovy"> def localMethod() { def localVariable = new java.util.Date() return { println localVariable } }

def clos = localMethod()

println "Executing the Closure:" clos() //prints the date when "localVariable" was defined </pre>

隐含变量

在groovy闭包当中,许多变量被定义成有特定的意义:

it

如果你有一个只含一个参数的闭包,你可能隐藏此参数,如下: <pre class="brush:groovy"> def clos = { print it } clos( "hi there" ) //prints "hi there" </pre>

this, owner, and delegate

this:在java中,this指向闭包所定义的宿主类的实例。
owner:宿主对象(this或附近的闭包)。
delegate:默认情况下,它与owner是一样的,但是也有不同的地方,例如builderExpandoMetaClass
示例: <pre class="brush:groovy"> class Class1 { def closure = { println this.class.name println delegate.class.name def nestedClos = { println owner.class.name } nestedClos() } }

def clos = new Class1().closure clos.delegate = this clos() /* prints: Class1 Script1 Class1$_closure1 */ </pre>

闭包用作方法的参数

当一个方法把闭包当做最后一个参数时,你可以定义一个行内闭包,如下: <pre class="brush:groovy"> def list = ['a','b','c','d'] def newList = []

list.collect( newList ) { it.toUpperCase() } println newList // ["A", "B", "C", "D"] </pre> 在上述的例子当中,collect方法接收一个list参数和一个closure参数。下面的代码一样能完成上面的功能(虽然比较繁琐): <pre class="brush:groovy"> def list = ['a','b','c','d'] def newList = []

def clos = { it.toUpperCase() } list.collect( newList, clos )

assert newList == ["A", "B", "C", "D"] </pre>

更多

Groovy继承自java.lang.Object,许多集合Map类的方法都支持闭包作为参数。在实际使用Groovy闭包的过程中请参阅GDK Extensions to Object
参见:

标签: groovy 闭包
共有 人打赏支持
不战则亡
粉丝 2
博文 5
码字总数 5090
×
不战则亡
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: