文档章节

Groovy的闭包

不战则亡
 不战则亡
发布于 2015/02/16 22:43
字数 727
阅读 82
收藏 1
点赞 0
评论 0

什么是闭包

一个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
杭州
程序员
Gradle从入门到实战 - Groovy基础

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

亭子happy
06/13
0
0
MOP——方法拦截

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

zachaxy
2017/12/09
0
0
Gradle之- Groovy基础

Gradle是目前Android主流的构建工具,不管你是通过命令行还是通过Android Studio来build,最终都是通过Gradle来实现的。所以学习Gradle非常重要。 Groovy最终被编译成class字节码文件运行在j...

Jdqm
05/31
0
0
Groovy++:与Groovy有何不同

1.Groovy++编译时检查更严格 例1: / Leave it commented to run the dynamic Groovy version; Uncomment to run Groovy++ version / //@Typed package test def x = { List list -> list.si......

绿悠悠
2010/08/24
2.6K
2
gradle/Groovy语法

Groovy官网的介绍(http://www.groovy-lang.org/download.html#gvm) Gradle API 文档: https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 深入理解Android(一)......

shareus
04/27
0
0
自己动手应用Groovy实现Gradle的DSL(二) Groovy的高级特性

转载请注明出处: http://my.oschina.net/u/874727/blog/741610 如有问题可以加Q: 1025250620 非墨写的文章有时候是比较乱入的。只是觉得读者可能会需要这一部分的只是,所以临时插入。本篇文章...

-非墨-
2016/09/07
77
0
Gradle基础知识(1)

安装Gradle 确保安装你的电脑了Java7或以上版本 在这里下载最新的Gradle distribution 创建一个文件夹,把下载的压缩包解压进去(以为例),然后进入文件夹中的bin目录,复制路径(),把路径...

Stack_overflow
2017/11/18
0
0
Java 8的Lambda VS Groovy的Closure

本文翻译自:http://www.javacodegeeks.com/2014/06/java-8-lambdas-vs-groovy-closures-compactness-grouping-and-summing.html Java 8已经支持lambdas,它很像Groovy早就支持的:闭包。 在......

翟志军
2014/07/18
0
2
Groovy&Grails-技术问答-Groovy闭包

闭包可能是Groovy中最重要的概念,使用概率也非常高,下面的几个代码让我们熟悉闭包的作用。 最简单的使用 带参数使用 在闭包中定义方法 将闭包作为方法的参数传递

寡鸡蛋
2013/10/02
0
0
升级到Groovy 1.7.2的三个理由

Groovy 1.7.2已于两天前(Apr 07)正式发布了!我们可以在Groovy网站上看到这个版本的发布信息。但是有人会问:有必要立即升级到1.7.2么?三个理由让你决定升级! 将GPathResults转换成XML G...

groovyland
2010/04/09
320
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CoreText进阶(七)-添加自定义View和对其

CoreText进阶(七)-添加自定义View和对其 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更多...

aron1992
8分钟前
0
0
Python爬虫 爬取百合网的女人们和男人们

学Python也有段时间了,目前学到了Python的类。个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇。 据书上说...

p柯西
19分钟前
0
0
在Java中,你真的会日期转换吗

1.什么是SimpleDateFormat 在java doc对SimpleDateFormat的解释如下: SimpleDateFormatis a concrete class for formatting and parsing dates in a locale-sensitive manner. It allows fo......

Java小铺
28分钟前
0
0
Linux系统梳理---系统搭建(二):tomcat的安装和使用

上一章讲到JDK的安装使用,这一章主要记录下服务器tomcat的安装以及部署一个项目. 1.下载tomcat,这里下载的是apache-tomcat-8.5.32.tar.gz 2.创建文件夹,便于管理,和JDK一样,在usr目录下创建t...

勤奋的蚂蚁
38分钟前
0
0
ES15-聚合

1.Terms Aggregation 分组聚合 2.Filter Aggregation 过滤聚合

贾峰uk
40分钟前
0
0
【2018.07.19学习笔记】【linux高级知识 20.27-20.30】

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数

lgsxp
42分钟前
0
0
10.32/10.33 rsync通过服务同步~10.35 screen工具

通过服务的方式同步要编辑配置文件:[root@linux-xl ~]# vim /etc/rsyncd.confport=873log file=/var/log/rsync.logpid file=/var/run/rsyncd.pidaddress=192.168.43.21[tes...

洗香香
46分钟前
0
0
与女儿谈商业模式 (3):沃尔玛的成功模式

分类:与女儿谈商业模式 | 标签: 经济学 沃尔玛 陈志武 2007-05-10 09:09阅读(11279)评论(30) 与女儿谈商业模式 (3):沃尔玛的成功模式 陈志武 /文 沃尔玛(Wal-Mart)是另一个有意思的财...

祖冲之
52分钟前
0
0
网页加载速度优化方法总结

1、减少请求 最大的性能漏洞就是一个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。 2、整合资源 对开发...

Jack088
58分钟前
0
0
dubbo学习

https://blog.csdn.net/houshaolin/article/details/76408399

喵五郎
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部