文档章节

Groovy的闭包

一寸飞
 一寸飞
发布于 2015/02/16 22:43
字数 727
阅读 86
收藏 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 中的funtion 和 Closure

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Allocator/article/details/84860885 文章目录 背景 使用gradle 构建的项目中会使用groovy语言来完成项目构建...

Allocator
2018/12/10
0
0
Gradle入门系列(一)——groovy基础语法

groovy基础语法 一、变量 1、类型 对象类型、基本类型(本质是对象类型) 输出: 结论: 从log输出可以得出,groovy中实质上是没有基本类型的,本质是java中的装箱对象类型。 2、定义 强类型定...

GitLqr
01/05
0
0
Gradle从入门到实战 - Groovy基础

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

亭子happy
2018/06/13
0
0
Groovy入门 | 基础语法

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

水天云黑白
2018/10/28
0
0
Gradle升仙路之Groovy(1)

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

木九天
2018/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。 本地应用一键部署到任何...

阿里云云栖社区
16分钟前
1
0
金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?

根据 2017 年的 DevOps 发展报告,高效能组织和低效能组织在软件交付的效率上有数量级上的差异。技术组织的软件交付能力是一种综合能力,涉及众多环节,其中发布是尤为重要的环节。 作为技术...

问题终结者
44分钟前
3
0
Kubernetes Client-go Informer 源码分析

几乎所有的Controller manager 和CRD Controller 都会使用Client-go 的Informer 函数,这样通过Watch 或者Get List 可以获取对应的Object,下面我们从源码分析角度来看一下Client go Informe...

阿里云官方博客
今天
4
0
传统IDC部署网站(三)

11. 重置密码 密钥和密码都支持远程登陆, 二选一 两个都可以登陆, 密钥相对于密码来说,相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089
今天
6
0
bash特性

1.支持别名 alias 2.命令替换 $(COMMANS) 或者 `COMMAND` 3. bash支持的引号: `` :命令替换 "":弱引用,可以实现变量替换 '':强引用,不实现变量替换 4.文件名通配 globbing:(man 7 glo...

忙碌的小蜜蜂
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部