什么是闭包

一个groovy闭包就像一个代码块或者方法指针,他是定义然后执行的一段代码,但是他有一些特性:隐含变量,支持自由变量,支持currying 。

我们先来看看一些例子:

1 def clos = { println "hello!" }
2  
3 println "Executing the Closure:"
4 clos() //prints "hello!"

在上面的例子中”hello!”是因为调用clos()函数才打印出来的,而不是在定义的时候打印出来的。

参数

闭包的参数在->之前列出,比如:

1 def printSum = { a, b -> print a+b }
2 printSum( 5, 7 ) //prints "12"

如果闭包的参数是少于2个的话,那么 ->是可以省略的。

Parameter notes

A Closure without -> , i.e. {} , is a Closure with one argument that is implicitly named as ‘it’. (see below for details) In some cases, you need to construct a Closure with zero arguments, e.g. using GString for templating, defining EMC Property etc. You have to explicity define your Closure as { -> } instead of just { }

You can also use varargs as parameters, refer to the Formal Guide for details. A JavaScript-style dynamic args could be simulated, refer to the Informal Guide.

自由变量

闭包能引用在参数列表中没有列出的变量,这些变量成为自由变量,他们的作用范围在他们定义的范围内:

1 def myConst = 5
2 def incByConst = { num -> num + myConst }
3 println incByConst(10) // => 15

另外一个例子:

1 def localMethod() {
2  def localVariable = new java.util.Date()
3  return { println localVariable }
4 }
5  
6 def clos = localMethod()
7  
8 println "Executing the Closure:"
9 clos() //prints the date when "localVariable" was defined

隐式变量

it

如果你有一个闭包但是只有一个参数,那么你可以省略这个参数,比如:

1 def clos = { print it }
2 clos( "hi there" ) //prints "hi there"

this, owner, and delegate

this : 和java中是一样的, this refers to the instance of the enclosing class where a Closure is defined

owner : the enclosing object (this or a surrounding Closure)

delegate : by default the same as owner, but changeable for example in a builder or ExpandoMetaClass

1 class Class1 {
2  def closure = {
3  println this.class.name
4  println delegate.class.name
5  def nestedClos = {
6  println owner.class.name
7  }
8  nestedClos()
9  }
10 }
11  
12 def clos = new Class1().closure
13 clos.delegate = this
14 clos()
15 /* prints:
16  Class1
17  Script1
18  Class1$_closure1 */

闭包作为方法参数

当一个方法使用闭包作为最后一个参数的话,那么就可以内嵌一个闭包,比如:

1 def list = ['a','b','c','d']
2 def newList = []
3  
4 list.collect( newList ) {
5  it.toUpperCase()
6 }
7 println newList // ["A", "B", "C", "D"]

在上面的collect方法中,他接受一个一个List和闭包,上面的代码等价于下面的代码:

1 def list = ['a','b','c','d']
2 def newList = []
3  
4 def clos = { it.toUpperCase() }
5 list.collect( newList, clos )
6  
7 assert newList == ["A", "B", "C", "D"]

更多的信息:

Groovy继承了 java.lang.Object并且许多的 Collection 和Map 的许多方法都接受闭包作为参数的 See GDK Extensions to Object for practical uses of Groovy's Closures.

See Also:

 

groovy-闭包的更多相关文章

  1. Java8-Function使用及Groovy闭包的代码示例

    导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...

  2. Groovy闭包详解

    Groovy闭包是一种可执行代码块的方法,闭包也是对象,可以向方法一样传递参数,因为闭包也是对象,因此可以在需要的时候执行,像方法一样闭包可以传递一个或多个参数.闭包最常见的用途就是处理集合,可以遍历 ...

  3. 谈谈Groovy闭包

    A closure is a function with variables bound to a context or environment in which it executes. 概述 闭包 ...

  4. Java8函数接口实现回调及Groovy闭包的代码示例

    本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场景: 主体流程是不变的,变的只是其中要调用的具体方法. 其特征是:   Begi ...

  5. lambda表达式和groovy闭包的区别

    groovy定义的闭包是 Closure 的实例,lambda表达式只是在特定的接⼝或者抽象类的匿名实现,他们之间最主要区别闭包可以灵活的配置代理策略⽽labmda表达式不允许

  6. Groovy闭包

    定义 闭包(Closure)是一种数据类型,它代表一段可执行的代码.它可以作为方法的参数,或者返回值,也可以独立运行,定义如下: def xxx = {parameters -> code}   ...

  7. groovy闭包科里化参数

    科里化闭包:带有预先绑定形参的闭包.在预先绑定一个形参之后,调用闭包时就不必为这个形参提供实参了.有助于去掉方法调用中的冗余重复. 使用curry方法科里化任意多个参数 使用rcurry方法科里化后面 ...

  8. Gradle学习之闭包

    Gradle中的闭包其实就等同于Groovy中闭包,Groovy是一种jvm语言,语法兼容于java,曾几何时,也在脚本语言中独树一帜,初学Gradle的时候,大家很容易被其语法所迷惑,由于Gradl ...

  9. 基于Groovy+HttpRestful的超轻量级的接口测试用例配置的设计方案及DEMO实现

    目标 设计一个轻量级测试用例框架,接口测试编写者只需要编写测试用例相关的内容(入参及结果校验),不需要理会系统的实现,不需要写跟测试校验无关的内容. 思路 测试用例分析 一个用例由以下部分组成: (1 ...

  10. 《Gradle权威指南》--Groovy基础

    No1: Groovy中分号不是必须的 No2: Groovy中,单引号和双引号都可以定义一个字符串常量,不同的是单引号标记的是纯粹的字符串常量,而不是对字符串里的表达式做运算,但是双引号可以. ta ...

随机推荐

  1. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  2. .project sturcture和Project Structure 无论是按快捷键或者是从files中打开都不显示

    project sturcture和Project Structure 无论是按快捷键或者是从files中打开都不显示 event log中报:IllegalArgumentException:Mul ...

  3. 纯CSS3制作九款可爱复古相机

    前言 掐指一算,快两个月没写博客分享了.好吧,我就只是在准备校招而已.现在已经有满意的offer了,所以我就回来啦!这两个月过得挺煎熬也挺充实的.具体细说估计得长篇大论,我就不闲扯了.总之呢,越努力, ...

  4. ASP.NET错误处理的方式(总结)

    转载至: http://www.cnblogs.com/chinhr/archive/2007/06/26/795947.html ASP.NET错误处理的方式(整理&总结)英文文章研究:ht ...

  5. 你都认识下面这些参数么?【Camera】

    在调试的时候利用下面这个函数将 Camera AP 部分所设置的参数全部 dump 出来了,真是多啊! 这里仅限于 MTK 平台,MTK 自己在相机这块添加了许多功能,所以看起来就有一大堆的参数. 调 ...

  6. GSON

    { "data": [ { "children": [ { "id": 10007, "title": "北京 ...

  7. Ubuntu 14.04 下安装google的浏览器——Chrome

    小编用过好多浏览器,但最后还是选择Chrome, 因为这款浏览器确实做的不错,可是Ubuntu下自带的是火狐,因此小编在这里和大家分享一下如何在Ubuntu下安装chrome浏览器 工具/原料   安 ...

  8. Hash中的一些概率计算

    Hash是把锋利的刀子,处理海量数据时经常用到,大家可能经常用hash,但hash的有些特点你是否想过.理解过.我们可以利用我们掌握的概率和期望的知识,来分析Hash中一些有趣的问题,比如: 平均每个 ...

  9. WPF ListView DoubleClick

    <ListView   x:Name="TrackListView"  MouseDoubleClick="MouseDoubleClick"       ...

  10. 阿里客户端工程师试题简析——Android应用的闪退(crash)分析

    1. 问题描述 闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法.在出现crash后如何捕捉并分析异常这两个问题给出自己的解 ...