(一)Closures(闭包):
使Groovy与其他大多数编程序语言不同的是---它能创造头等对象的functions(注:原文that you can create functions that are first class objects 我对这句话理解不是很深,所以写上原文,以免误人,如果大家对这句话有好的理解,希望能在评论上给予指正)。换句话说,你可以定义一个代码块,然后把它看作是一个字符串或是整数来传递。
Code(1):
square = { it * it }
Groovy编辑器会把上面这段用大括号围绕着it*it的表达式会看成代码。在软件世界里,这样的形式被叫做“closure(闭包)”。标识符"it"代表function中给定的任何值。
Code(2):
square(9)
现在我们传递一个Number为9的数字到“闭包”square(),大家可以简单的理解下:先定义一个闭包Code(1);
it在这里可以看作是闭包中的参数,代表任何值,然后执行你想要的操作,上面是it*it。定义完“闭包”后,你就可以使用“闭包”,
Code(2)传递给“闭包”9,它的返回结果为81.到这里,大家应该对“闭包”能简单理解了。
上面这些可能都不会让你产生兴趣,当你知道闭包是可以作为值来传递的,你就不会这样想了。Groovy有些内置的函数(functions),这些函数的参数可以使用其他的函数作为参数。
Code(3):
[ 1, 2, 3, 4 ].collect(square)
在上面的实例当中,创建了一个值为[1,2,3,4]的array。然后调用方法collect().并把上面定义的闭包作为参数。
现在我们来理解下:array中的每个元素都会调用collect(),然后每个元方素又作为闭包的参数来执行闭包里的法it*it。返回的结果为[1,4,9,16],可能看结果更直接点。。。
当然,Groovy中还有更多这样的方法使用闭包作为参数。
默认的情况下,Groovy使用一个叫“it”的参数,你也可以使用指定的参数来创建闭包。现在使用Map.each()作为实例让闭包带有两个变量,来广联Map中的key,Value。
printMapClosure = { key, value -> println key + "=" + value }
[ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan"
].each(printMapClosure)
上面可以看出
先定义一个闭包
printMapClosure = { key, value -> println key + "=" + value }
他的作用是输出Map中Key,Value的值,形式是key=Value.
输出结果为:
yue=wu
lane=burks
sudha=saseethiaseeleethialeselan
当然还有更多的关于闭包的实例,比如这里
fullString = ""
orderParts = ["BUY", 200, "Hot Dogs", "1"]
orderParts.each {
fullString += it + " "
}
println fullString
myMap = ["asdf": 1 , "qwer" : 2, "sdfg" : 10]
result = 0
myMap.keySet().each( { result+= myMap[it] } )
println result
好了了解了基本的闭包,现在来看下使用闭包来出来File吧。
在Groovy中使用闭包读取File文件是相当的简单。
Code:
myFileDirectory = "C:\\temp\\"
myFileName = "myfile.txt"
myFile = new File(myFileDirectory + myFileName)
printFileLine = { println "File line: " + it }
myFile.eachLine( printFileLine )
- 先定义文件夹路径变量
- 定义实际要读取的文件变量
- 新建File对象
- 定义一个具有读取每行文件功能的闭包
- 调用File对象的方法eachLine(),并把闭包{println "file line:"+it}作为参数
执行上面的代码后,将显示你读取的myfile.txt的每一行。
如果你正在跟着这个系列的脚步,可以自己运行上面的实例,加深对闭包的理解。
看了这么多实例,再看下闭包的定义好了(根据官方的文档,现在这个部分不是放在起步文档里,不过想提前翻译给大家,加深对闭包的了解)
- 闭包可以被看作代码块或者方法指示器。
def clos = { println "hello! }
println "Executing the closure:"
clos() //prints "hello!"
- 闭包的参数放置于->号之前
def clos = { a, b -> print a+b }
clos( 5, 7 ) //prints "12"
假如你的参数少于2个的话,参数和->是可以省略,如上面的代码。 - 在闭包中包含了几个内置的标量,他们代表了特定的含义:
- It:这个是闭包的默认值, 假如你的参数少于2个的话。
def clos = { print it }
clos( "hi there" ) //prints "hi there"
- this : 在Java中, 指向定义了闭包的封装类
- owner : 封装类中的闭包
- delegate : 和owner,但也存在变化,会在以后讲解
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平台上运行,并且与Java语法高度兼容,使得开发者能够利用Groovy的简洁性和灵活性来增强Java开发的效率。 这个SDK包含了Groovy 2.5.6的所有核心组件,使得开发者...
Groovy是一种动态、灵活的编程语言,它是Java平台上的一个重要的补充。Groovy结合了Python、Ruby和Smalltalk等语言的特性,同时保留了Java的语法结构,使得它在Java开发者中广受欢迎。Groovy提供了简洁的语法,使得...
标题 "groovy-and-java-8" 提到的是一个关于 Groovy 语言与 Java 8 特性的比较。Groovy 是一种动态类型、基于 JVM 的编程语言,它在设计时借鉴了 Python、Ruby 和 Smalltalk 的许多特性,而 Java 8 是 Java 平台的一...
Apache Groovy SDK 2.4.15 是一个强大的、动态的编程语言,它与Java平台紧密集成,提供了简洁的语法和丰富的元编程能力。这个SDK包含Groovy语言的完整开发工具包,允许开发者在Java平台上进行Groovy程序的设计、构建...
Apache Groovy SDK 3.0.8 是一个用于开发Groovy应用程序的软件开发工具包,它为Java开发者提供了一个强大的动态编程语言环境。Groovy是一种基于JVM(Java Virtual Machine)的灵活、简洁且富有表现力的语言,它可以...
它具备完全的对象导向性、可选的类型系统、操作符定制能力、简洁的数据类型声明、闭包(Closures)、范围表达(Ranges)、紧凑的属性语法以及与Java的无缝集成等特点。这些特性使得Groovy不仅能够作为脚本语言使用,...
- **介绍**: 该章节讨论了从Java转向Groovy时的一些关键差异和相似之处。 - **核心知识点**: - Groovy的动态特性与Java的静态特性比较 - Groovy中的类型推断 - 使用Groovy增强现有的Java代码 - Groovy与Java互...
Groovy是一种动态、类型安全的编程语言,专为Java虚拟机(JVM)设计,它在Java生态系统中扮演着重要角色。Groovy结合了面向对象编程(OOP)、函数式编程(FP)以及脚本语言的简洁性,使得开发者能够更高效地编写代码...
- **Dynamic Syntax**: Explanation of Groovy's dynamic syntax and how it differs from Java, including closures, traits, and metaclass programming. - **Integration with Java**: Discussion on seamless ...
1. **语法简洁**:Groovy的语法比Java更为简洁,如使用闭包(closures)代替Java中的匿名内部类,使代码更易读、易写。 2. **动态类型**:Groovy是动态类型的,无需预先声明变量的类型,这使得编写代码更快速,但...
Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...
Groovy,被誉为Java的“帝国王储”,是一种强大的、动态的、基于JVM(Java Virtual Machine)的编程语言。它的设计目标是简化Java开发者的工作,让编程变得更简单、更有趣,同时也保持了与Java的完全互操作性。...
2. **简洁的语法**:Groovy的语法比Java更加简洁,例如,它可以使用闭包(Closures)来替代匿名内部类,使代码更易读、更少冗余。 3. **元编程**:Groovy的强大之处在于其元编程能力,可以改变或扩展程序的行为。...
Groovy是一种动态、开源的编程语言,它设计用于在Java平台上运行,并且与Java高度兼容。Groovy Windows Installer是专为Windows操作系统用户设计的安装包,使得在Windows系统上便捷地安装和配置Groovy环境变得可能。...
6. **GDK(Groovy Development Kit)**:Groovy提供了一系列扩展的API,称为Groovy GDK,它增强了Java的内置类型。通过源码,我们可以看到GDK如何增强Java类库的使用。 7. ** Grape**:Grape是Groovy的依赖管理系统...
Making Java Groovy Kenneth A. Kousen 1.Easier Java 2.Closures, builders, and metaprogramming 3.Gradle for builds, Spock for testing 4.Groovy frameworks like Grails and Griffon 源码
Groovy是一种基于Java平台的动态、灵活的编程语言,它在设计时充分考虑了开发者的便利性和效率。Groovy 1.8.6是该语言的一个版本,它为开发者提供了许多增强的功能和改进,旨在提高生产力和代码的可读性。这个版本...
本书全面介绍了Groovy这一强大的、基于Java平台的脚本语言,旨在帮助读者从零开始掌握Groovy,并深入了解其高级特性。 #### Groovy简介 Groovy是一种面向对象的编程语言,设计用于提高开发效率,同时保持与Java平台...