`
flyleave
  • 浏览: 71691 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

什么是闭包(Groovy)

阅读更多
Groovy的闭包就像一个代码段或者说方法指针。它是一段被定义并在稍后的时点上运行的代码。
Simple Example
def clos = { println "hello! }


示例: def clos = { println "hello!}
      println "Executing the closure:"
      clos()  
     


注意在上面的例子中,"hello"在闭包被调用的时候才打印出来,而不是在定义的时候。
Closures may be "bound" to variables within the scope where they are defined:
闭包可以与在特定范围内定义的变量绑定起来(这句不知翻译的对错,请看原文)
def localMethod() {
  def localVariable = new java.util.Date()
  return { println localVariable }
}

def clos = localMethod()

println "Executing the closure:"
clos()     //打印出当localVariables被创建时的时间

参数:
闭包的参数在->之前被列出,比如
def clos = { a, b -> print a+b }
clos( 5, 7 )                       //prints "12"


-> 这个符号是可选的,当你定义的闭包的参数小于两个时就可将其省略

隐含的变量
在闭包中,有几个变量有着特别的含义

it(注意是小写):
如果你的闭包定义仅含有一个参数,可以将其省略,Groovy自动用it来代替
比如:
def clos = { print it }
clos( "hi there" )              //prints "hi there"


this, owner, 和 delegate

this :  如同在Java中一样,this 代表闭包被定义的类

owner : 包含闭包的对象,有可能是定义闭包的类或者是另外一个闭包

delegate : 默认与owner相同,but changeable for example in a builder or ExpandoMetaClass

Example:

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  */


作为方法参数的闭包

当一个方法的最后一个参数是闭包的时候,我们可以将闭包紧随其后定义,如
def list = ['a','b','c','d']
def newList = []

list.collect( newList ) {
  it.toUpperCase()
}
println newList           //  ["A", "B", "C", "D"]


上一个例子也可以用下面的方法实现,就是稍显冗长。

def list = ['a','b','c','d']
def newList = []

def clos = { it.toUpperCase() }
list.collect( newList, clos ) 

assert newList == ["A", "B", "C", "D"]

更多:
Groovy 用很多可以接受闭包作为参数的方法扩展了java.lang.Object
上文提到的 collect 就是这样一个例子 
collect(Collection collection) {closure} 返回一个集合,并将该集合的每一项添加到给定的集合中
分享到:
评论
2 楼 epan.chen 2009-02-19  
像如下的 代码:
def index = {
 if (session?.speaker) {
 redirect(controller:"paper",action:"index") 
 }
 }
 

算是闭包吗?
1 楼 ibio 2009-02-18  
不错不错,顶一个先。JS的闭包据说是这样的:

闭包的两个特点:

1。作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
2。一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

<script type="text/javascript">
function sayHello2(name) {
var text = 'Hello ' + name; // local variable
var sayAlert = function() { alert(text); }
return sayAlert;
}
var sy = sayHello2('never-online');
sy();
</script>

相关推荐

    [Groovy入门]第五讲.将流程控制语句与方法重构为闭包

    首先,让我们了解什么是闭包。闭包是Groovy中的一种函数对象,它可以捕获和存储其定义时的作用域内的变量,即使在闭包被传递或存储后仍然可以访问这些变量。闭包的特点在于它的“闭合”特性,即它能够记住并访问创建...

    groovy入门经典,groovyeclipse 插件

    Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...

    groovy入门实例代码详细(包括字符串,map,闭包等等)

    本入门实例代码详细地涵盖了Groovy的一些核心概念和常用特性,包括字符串操作、Map的使用以及闭包等。 1. **字符串操作**: - Groovy中的字符串可以是单引号或双引号包裹的。双引号中的变量可以直接展开,单引号则...

    Groovy Script 入门

    3. **闭包支持**:闭包是Groovy的一个强大特性,它可以像对象一样被传递和存储,用于实现高级编程模式。 4. **元编程**:Groovy支持元编程,可以通过反射机制修改程序的行为。 5. **简洁的语法**:Groovy具有简洁的...

    groovy in action 中文版 2017.11

    Groovy提供了大量的动态特性,比如动态类型、闭包、元编程能力等,使得编写脚本或应用程序变得更加高效和愉悦。Groovy是完全兼容Java的,这意味着Java开发人员可以轻松地使用Groovy编写程序,并利用Groovy提供的强大...

    groovy(10)-闭包委托策略1

    在Groovy语言中,闭包是一种强大的特性,它允许我们创建可执行的代码块,并可以在不同的上下文中使用。闭包有三个重要的变量:`this`, `owner`, 和 `delegate`,它们各自扮演着不同的角色。 1. **this**: `this`...

    groovy-2.3.6-installer

    Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发(如Grails框架)、自动化测试(Spock框架)、数据处理和集成等多种用途。 Groovy与Java的互操作性是其...

    groovy

    3. 支持闭包:Groovy中的闭包类似于函数引用,可作为参数传递,有助于实现函数式编程风格。 4. GString:类似于Java的字符串,但支持占位符表达式,使字符串操作更便捷。 5. 链式调用:对象属性和方法可以连续调用,...

    apache-groovy-sdk-4.0.1下载

    - **闭包**:Groovy的闭包是强大的功能,可以用来实现函数式编程和回调机制,使得代码更加简洁和高效。 - **元编程**:Groovy允许在运行时修改类和对象的行为,这使得它非常适合构建框架和库,比如Grails web框架...

    Groovy PPT

    - **闭包**:闭包是Groovy的一大特色,它们可以作为可重用和可赋值的代码块,极大地增强了代码的灵活性。 - **领域特定语言(DSL)**:Groovy强大的元编程能力使得开发者能够轻松创建各种领域特定语言。 - **构建器**...

    Z2-Groovy in Action.pdf

    Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它与Java语言无缝集成,同时提供了动态语言的许多特性,例如动态类型、闭包(closures)和元编程等。它由James Strachan于2003年首次提出,并迅速受到了社区的...

    groovy-api-chm

    4. **闭包**:闭包是Groovy中的关键特性,它是可调用的代码块,可以作为参数传递,也可以存储在变量中。闭包有上下文(owner)和作用域,可以访问和修改这些环境中的变量。 5. **元编程**:Groovy允许在运行时修改...

    groovy速查手册

    - **函数与方法**:支持定义函数和方法,包括闭包的使用,闭包是Groovy的一个强大特性,它允许创建可传递的匿名函数。 - **异常处理**:提供异常处理机制,如`try-catch-finally`块。 #### 四、运算符 Groovy支持...

    groovy经典_资料

    2. **闭包(Closures)**:闭包是Groovy的一个强大特性,它是一种匿名函数,可以捕获其所在上下文的变量,常用于函数式编程和数据处理。 3. **领域规范语言(DSLs)**:Groovy可以方便地构建DSL,使得特定领域的...

    Groovy安装以及简单使用

    在Groovy中,`each`方法接收一个闭包作为参数,这个闭包对数组中的每个元素进行操作。上面的代码会打印出每个数字的两倍值。 Groovy与Java的集成非常紧密,可以通过`@groovy.transform.CompileStatic`注解实现静态...

    Groovy学习资料

    此外,Groovy还有闭包(Closure)的概念,这是Groovy强大的功能之一,它可以用来处理函数式编程任务,如数据过滤和映射。 其次,Groovy的动态特性是另一个关键知识点。Groovy可以在运行时改变类的结构,这意味着你...

    Groovy轻松入门—搭建Groovy开发环境

    - **闭包**:Groovy的闭包是强大的功能,类似于函数指针,可以用于函数式编程。 - **GString**:Groovy中的字符串可以使用`${expression}`内嵌表达式,例如`"Hello, ${name}"`。 - **方法默认参数和命名参数**:...

    groovy基础语法.pdf

    Groovy语言能够与Java无缝集成,并且支持动态语言特性,包括动态类型、闭包和元编程等。Groovy的语法非常接近Java,但它更为简洁,减少了大量的模板代码,使得开发更为高效。 在Groovy中,基本语法包括变量、属性、...

Global site tag (gtag.js) - Google Analytics