`
Javabengou
  • 浏览: 173453 次
  • 性别: Icon_minigender_1
  • 来自: 郴州
社区版块
存档分类
最新评论

Groovy(Java笨狗)系列---closures(四)

阅读更多

(一)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个的话,参数和->是可以省略,如上面的代码。
  • 在闭包中包含了几个内置的标量,他们代表了特定的含义:
  1. It:这个是闭包的默认值, 假如你的参数少于2个的话。
    def clos = { print it }
    clos( "hi there" ) //prints "hi there"
     
  2. this : 在Java中, 指向定义了闭包的封装类
  3. owner : 封装类中的闭包
  4. 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"]

更多闭包的信息可以从官网查看,当然在后面也会对闭包做更详细的说明(按照官方文档的来翻译的,大家不了解的先==吧)。

 

 

 

0
0
分享到:
评论
5 楼 Javabengou 2008-01-17  
非常感谢!
4 楼 hax 2008-01-17  
That is you can define a chunk of code and then pass it around as if it were a string or an integer.

你可以定义一个代码块,然后把它传来传去,就好象它是一个字符串或是整数。
3 楼 Javabengou 2008-01-12  
Groovy中一切都是对象
闭包也是对象
2 楼 JohnnyJian 2008-01-11  
“That is you can define a chunk of code and then pass it around as if it were a string or an integer.”
意思是说你可以把闭包当作一般的对象来传递吧……
1 楼 lmbb1945 2008-01-04  
:idea: 支持

相关推荐

    apache-groovy-sdk-2.5.6.zip

    Groovy是一种面向对象的、动态的编程语言,它在Java平台上运行,并且与Java语法高度兼容,使得开发者能够利用Groovy的简洁性和灵活性来增强Java开发的效率。 这个SDK包含了Groovy 2.5.6的所有核心组件,使得开发者...

    groovy

    Groovy是一种动态、灵活的编程语言,它是Java平台上的一个重要的补充。Groovy结合了Python、Ruby和Smalltalk等语言的特性,同时保留了Java的语法结构,使得它在Java开发者中广受欢迎。Groovy提供了简洁的语法,使得...

    groovy-and-java-8

    标题 "groovy-and-java-8" 提到的是一个关于 Groovy 语言与 Java 8 特性的比较。Groovy 是一种动态类型、基于 JVM 的编程语言,它在设计时借鉴了 Python、Ruby 和 Smalltalk 的许多特性,而 Java 8 是 Java 平台的一...

    apache-groovy-sdk-2.4.15

    Apache Groovy SDK 2.4.15 是一个强大的、动态的编程语言,它与Java平台紧密集成,提供了简洁的语法和丰富的元编程能力。这个SDK包含Groovy语言的完整开发工具包,允许开发者在Java平台上进行Groovy程序的设计、构建...

    apache-groovy-sdk-3.0.8.zip

    Apache Groovy SDK 3.0.8 是一个用于开发Groovy应用程序的软件开发工具包,它为Java开发者提供了一个强大的动态编程语言环境。Groovy是一种基于JVM(Java Virtual Machine)的灵活、简洁且富有表现力的语言,它可以...

    groovy速查手册

    它具备完全的对象导向性、可选的类型系统、操作符定制能力、简洁的数据类型声明、闭包(Closures)、范围表达(Ranges)、紧凑的属性语法以及与Java的无缝集成等特点。这些特性使得Groovy不仅能够作为脚本语言使用,...

    Groovy and Grails Recipes(清晰PDF)

    - **介绍**: 该章节讨论了从Java转向Groovy时的一些关键差异和相似之处。 - **核心知识点**: - Groovy的动态特性与Java的静态特性比较 - Groovy中的类型推断 - 使用Groovy增强现有的Java代码 - Groovy与Java互...

    groovy包及相关学习资料

    Groovy是一种动态、类型安全的编程语言,专为Java虚拟机(JVM)设计,它在Java生态系统中扮演着重要角色。Groovy结合了面向对象编程(OOP)、函数式编程(FP)以及脚本语言的简洁性,使得开发者能够更高效地编写代码...

    Java - The Well-Grounded Java Developer

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

    groovy-binary

    1. **语法简洁**:Groovy的语法比Java更为简洁,如使用闭包(closures)代替Java中的匿名内部类,使代码更易读、易写。 2. **动态类型**:Groovy是动态类型的,无需预先声明变量的类型,这使得编写代码更快速,但...

    java 动态脚本语言 精通 Groovy

    Groovy是一种基于Java平台的动态脚本语言,它在Java开发者中越来越受欢迎,因为它提供了简洁、灵活的语法,以及强大的动态编程能力。Groovy与Java兼容性极佳,可以直接调用Java类库,使得它在Java生态系统中具有广泛...

    groovy-src-1.7.0

    Groovy,被誉为Java的“帝国王储”,是一种强大的、动态的、基于JVM(Java Virtual Machine)的编程语言。它的设计目标是简化Java开发者的工作,让编程变得更简单、更有趣,同时也保持了与Java的完全互操作性。...

    groovy-docs-1.8.6.zip

    2. **简洁的语法**:Groovy的语法比Java更加简洁,例如,它可以使用闭包(Closures)来替代匿名内部类,使代码更易读、更少冗余。 3. **元编程**:Groovy的强大之处在于其元编程能力,可以改变或扩展程序的行为。...

    groovy-windows-installer

    Groovy是一种动态、开源的编程语言,它设计用于在Java平台上运行,并且与Java高度兼容。Groovy Windows Installer是专为Windows操作系统用户设计的安装包,使得在Windows系统上便捷地安装和配置Groovy环境变得可能。...

    groovy-learning-源码.rar

    6. **GDK(Groovy Development Kit)**:Groovy提供了一系列扩展的API,称为Groovy GDK,它增强了Java的内置类型。通过源码,我们可以看到GDK如何增强Java类库的使用。 7. ** Grape**:Grape是Groovy的依赖管理系统...

    Making Java 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 1.8.6

    Groovy是一种基于Java平台的动态、灵活的编程语言,它在设计时充分考虑了开发者的便利性和效率。Groovy 1.8.6是该语言的一个版本,它为开发者提供了许多增强的功能和改进,旨在提高生产力和代码的可读性。这个版本...

    Groovy in Action

    本书全面介绍了Groovy这一强大的、基于Java平台的脚本语言,旨在帮助读者从零开始掌握Groovy,并深入了解其高级特性。 #### Groovy简介 Groovy是一种面向对象的编程语言,设计用于提高开发效率,同时保持与Java平台...

Global site tag (gtag.js) - Google Analytics