文档章节

Groovy的闭包

一寸飞
 一寸飞
发布于 2015/02/16 22:43
字数 727
阅读 83
收藏 1

什么是闭包

一个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
参见:

© 著作权归作者所有

共有 人打赏支持
一寸飞

一寸飞

粉丝 1
博文 10
码字总数 5090
作品 0
杭州
程序员
私信 提问
Groovy入门 | 基础语法

Java的东西Groovy都能用,包括语法和类库 Groovy继承了Java的所有东西,就是你突然忘了Groovy的语法可以写成Java代码,也就是Groovy和Java混在一起也能执行。 Groovy和Java一样运行在JVM,源...

水天云黑白
10/28
0
0
Gradle从入门到实战 - Groovy基础

前言 Android方向的第一期文章,会专注于Gradle系列,名字叫做『 Gradle从入门到实战』,计划有如下几个课程: Groovy基础 全面理解Gradle 如何创建Gradle插件 分析Android的build tools插件...

亭子happy
06/13
0
0
Gradle升仙路之Groovy(1)

构建工具发展史:Ant -- > Maven --> Gradle Gradle 由Groovy语言编写,因此基于Groovy环境运行。 1、Grovvy简介 1.1 场景 Groovy也是另外一种为DSL语言domain specific language,脚本编程语...

木九天
09/05
0
0
Android Gradle(三)Groovy快速入门指南

本文首发于微信公众号「刘望舒」 原文链接:Groovy快速入门看这篇就够了 前言 在前面我们学习了为什么现在要用Gradle?和Gradle入门前奏两篇文章,对Gradle也有了大概的了解,这篇文章我们接...

刘望舒
10/10
0
0
MOP——方法拦截

前面Groovy 对象和 MOP简单了介绍了 Groovy 所提供的 MOP 机制。 接下来要介绍利用 MOP 实现方法的拦截。 拦截:在对方法进行调用时,我们可能有一些其它的要求,eg:日志的记录,执行时间的...

zachaxy
2017/12/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

移动端Appium自动化测试框架的优势

众所周知,现在市面上的移动端操作系统已被Android和IOS占领,其中Android的份额更是在80%以上。那么面对市面上林林总总的自动化测试框架和工具,为什么说Appium在自动化测试框架的统治级优势...

程序猿拿Q
12分钟前
1
0
设计模式 之 观察者模式

设计模式 之 观察者模式 场景 场景比较简单,当一个对象的状态发生改变时,自动通知所有依赖(或观察)它的对象。 比如:发布/订阅 原理:发布者存储N个订阅者的对象信息,当发布者发布消息时...

GMarshal
16分钟前
1
0
linux 常用

netstat -tunlp |grep 8080 查看8080 占用 netstat -tunlp 用于查看所有的端口号的进程情况

west_coast
21分钟前
2
0
Bytom信息上链教程

比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ##用比原链(Bytom)实现信息上链 很多了解比原链的都知道,比原链是专注...

比原链Bytom
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部