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

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

什么是闭包

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

简单例子

<pre class="brush:groovy"> def clos = { println "hello!" } println "Executing the Closure:" clos() </pre>

上述的闭包是在被调用的时候执行,而不是定义的时候。

参数

闭包的参数位于->标志前面,如下:

<pre class="brush:groovy"> def printSum = { a, b -> print a+b } printSum( 5, 7 ) //prints "12" </pre>

->标志是可选的,在参数少于2个的时候可以被省略。

参数说明

一个像{}的不包含->标志的闭包其实是有一个隐含参数的,这个参数名是it。在有些情况下你必须构造一个没有参数的闭包,比如使用GString模板,定义EMC属性等等,你必须用{ -> }明确的定义你的闭包,而不是用{}
你当然也可以使用可变参数, 具体请参考正式指南。模拟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 闭包
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
不战则亡
粉丝 1
博文 5
码字总数 5090
×
不战则亡
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: