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} 返回一个集合,并将该集合的每一项添加到给定的集合中
分享到:
相关推荐
首先,让我们了解什么是闭包。闭包是Groovy中的一种函数对象,它可以捕获和存储其定义时的作用域内的变量,即使在闭包被传递或存储后仍然可以访问这些变量。闭包的特点在于它的“闭合”特性,即它能够记住并访问创建...
Groovy的语法简洁,支持面向对象编程、函数式编程,并提供了许多现代语言特性,如闭包和动态类型。这使得Groovy成为快速开发、脚本编写以及构建自动化等任务的理想选择。 GroovyEclipse是一款强大的Eclipse插件,...
本入门实例代码详细地涵盖了Groovy的一些核心概念和常用特性,包括字符串操作、Map的使用以及闭包等。 1. **字符串操作**: - Groovy中的字符串可以是单引号或双引号包裹的。双引号中的变量可以直接展开,单引号则...
3. **闭包支持**:闭包是Groovy的一个强大特性,它可以像对象一样被传递和存储,用于实现高级编程模式。 4. **元编程**:Groovy支持元编程,可以通过反射机制修改程序的行为。 5. **简洁的语法**:Groovy具有简洁的...
Groovy提供了大量的动态特性,比如动态类型、闭包、元编程能力等,使得编写脚本或应用程序变得更加高效和愉悦。Groovy是完全兼容Java的,这意味着Java开发人员可以轻松地使用Groovy编写程序,并利用Groovy提供的强大...
在Groovy语言中,闭包是一种强大的特性,它允许我们创建可执行的代码块,并可以在不同的上下文中使用。闭包有三个重要的变量:`this`, `owner`, 和 `delegate`,它们各自扮演着不同的角色。 1. **this**: `this`...
Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发(如Grails框架)、自动化测试(Spock框架)、数据处理和集成等多种用途。 Groovy与Java的互操作性是其...
3. 支持闭包:Groovy中的闭包类似于函数引用,可作为参数传递,有助于实现函数式编程风格。 4. GString:类似于Java的字符串,但支持占位符表达式,使字符串操作更便捷。 5. 链式调用:对象属性和方法可以连续调用,...
- **闭包**:Groovy的闭包是强大的功能,可以用来实现函数式编程和回调机制,使得代码更加简洁和高效。 - **元编程**:Groovy允许在运行时修改类和对象的行为,这使得它非常适合构建框架和库,比如Grails web框架...
- **闭包**:闭包是Groovy的一大特色,它们可以作为可重用和可赋值的代码块,极大地增强了代码的灵活性。 - **领域特定语言(DSL)**:Groovy强大的元编程能力使得开发者能够轻松创建各种领域特定语言。 - **构建器**...
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它与Java语言无缝集成,同时提供了动态语言的许多特性,例如动态类型、闭包(closures)和元编程等。它由James Strachan于2003年首次提出,并迅速受到了社区的...
4. **闭包**:闭包是Groovy中的关键特性,它是可调用的代码块,可以作为参数传递,也可以存储在变量中。闭包有上下文(owner)和作用域,可以访问和修改这些环境中的变量。 5. **元编程**:Groovy允许在运行时修改...
- **函数与方法**:支持定义函数和方法,包括闭包的使用,闭包是Groovy的一个强大特性,它允许创建可传递的匿名函数。 - **异常处理**:提供异常处理机制,如`try-catch-finally`块。 #### 四、运算符 Groovy支持...
2. **闭包(Closures)**:闭包是Groovy的一个强大特性,它是一种匿名函数,可以捕获其所在上下文的变量,常用于函数式编程和数据处理。 3. **领域规范语言(DSLs)**:Groovy可以方便地构建DSL,使得特定领域的...
在Groovy中,`each`方法接收一个闭包作为参数,这个闭包对数组中的每个元素进行操作。上面的代码会打印出每个数字的两倍值。 Groovy与Java的集成非常紧密,可以通过`@groovy.transform.CompileStatic`注解实现静态...
此外,Groovy还有闭包(Closure)的概念,这是Groovy强大的功能之一,它可以用来处理函数式编程任务,如数据过滤和映射。 其次,Groovy的动态特性是另一个关键知识点。Groovy可以在运行时改变类的结构,这意味着你...
- **闭包**:Groovy的闭包是强大的功能,类似于函数指针,可以用于函数式编程。 - **GString**:Groovy中的字符串可以使用`${expression}`内嵌表达式,例如`"Hello, ${name}"`。 - **方法默认参数和命名参数**:...
Groovy语言能够与Java无缝集成,并且支持动态语言特性,包括动态类型、闭包和元编程等。Groovy的语法非常接近Java,但它更为简洁,减少了大量的模板代码,使得开发更为高效。 在Groovy中,基本语法包括变量、属性、...