`
romejiang
  • 浏览: 96691 次
  • 性别: Icon_minigender_1
  • 来自: ...
社区版块
存档分类
最新评论

Groovy 闭包深入浅出

阅读更多

闭包概念

Groovy语言中闭包(closure)是一个非常重要的概念,而且深入的理解了闭包对充分用好Groovy有很大帮助。对闭包比较书面的一种解释“闭包是可以用作函数参数和方法参数的代码块”。其实Groovy的闭包更象是一个“代码块”或者方法指针,代码在某处被定义然后在其后的调用处执行。

现在支持闭包的语言有 Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Perl,Ruby 和 Python 。

闭包基础
来看一个例子:

def square = {it * it} // 定义一个叫square的闭包。it是默认的 参数名称

assert 4 == square(2) // 使用闭包

assert [1,4,9] == [1,2,3].collect(square) // 使用闭包


闭包类似Java的内类,区别是闭包只有单一的方法可以调用,但可以有任意的参数,闭包用“{}”括起,“->”前面是参数,后面是处理语句,可以直接调用,也可以使用call调用。不管那种调用,最后groovy编译器都会把编译成对doCall方法的调用,这是groovy对闭包的一个隐藏方法。

def closure = { param -> println("hello ${param}") }
closure.call("world!")
 
def closure = { greeting, name -> println(greeting + name) }
closure.call("hello ", "world!")

第一个例子演示了在字符串内使用参数的形式:${param}
第二个例子演示了多参数形式:用“,”分隔参数

如果你的参数少于2个,那么它可以直接忽略掉。如果只有一个参数,可以不写,而使用缺省的参数“it”,如下面的例子:

closure = { println "hello " + it }
closure.call("world!")

把闭包当作变量返回的例子:
def localMethod() {
  def localVariable = new java.util.Date()
  return { println localVariable }
}
 
def clos = localMethod()
 
println "Executing the closure:"
clos() 

 

Groovy闭包中几个隐含变量

it:默认的参数名,调用是如果没有传参数,it为null
this : 跟Java一样,是定义闭包所在类的一个引用,不管有多少层闭包嵌套,this指向的都是最上层的类。
owner : 封闭闭包的对象(如果只有一层闭包就是this,如果有多层闭包嵌套就是含有此闭包的上层闭包)
delegate :缺省值是owner,但是可以改变,后面详说。
看例子:

class Class1 {
  def closure = {
    println " ============================== "
    println "this = "+ this.class.name
    println "owner = " + owner.class.name
    println "delegate = " + delegate.class.name
    def nestedClos = {
        println " ============================== "
        println "this = "+ this.class.name
        println "owner = " + owner.class.name
        println "delegate = " + delegate.class.name
      def thirdClos = {
            println " ============================== "
            println "this = "+ this.class.name
            println "owner = " + owner.class.name
            println "delegate = " + delegate.class.name
      }
      thirdClos() 
    }
    nestedClos()
  }
}
 
def clos = new Class1().closure
//clos.delegate = this
clos()

执行结果:
 ==============================
this = Class1
owner = Class1
delegate = Class1
 ==============================
this = Class1
owner = Class1$_closure1
delegate = Class1$_closure1
 ==============================
this = Class1
owner = Class1$_closure1_closure2
delegate = Class1$_closure1_closure2

闭包实现接口

前面说了用闭包实现类,或继承其他类。现在看看怎么实现接口。


interface Test
{
 def test()
}
 
 
def test = {
 println'ok'
} as Test
    
test.test()
如果接口只有一个方法需要实现,比如Comparator,Runnable等接口就可以直接实现方法后加上 as Runnable接口名就可以。

多方法接口,groovy用Map的方法实现。

interface MultiFuncTest
{
    def test1()
    def test2(str)
}
 
 
def impl = [test1:{println'test'},
        test2:{str -> println str}] as MultiFuncTest


impl.test1()
impl.test2('ok')


delegate委托的用法
delegate委托在是一种常用设计模式,但在java中实现相对比较繁琐,groovy直接在GroovyObject中已经实现了delegate模式,所以在groovy中应用delegate很方便。

class Dog{
    def play = {
      "wang wang!"
    }
    def childmind = {
        println       delegate.play();     
    }
}

class Cat {
    def play = {"mi mi !"}
}

def dog = new Dog()
def cat = new Cat()

dog.childmind()

dog.childmind.delegate  = cat;
dog.childmind()

上面的例子是狗爸爸让老猫帮忙照看他的狗儿子玩游戏。

闭包是Groovy一种核心技术,也是现在比较流行的动态语言的核心技术,所以全面稳定的掌握闭包是非常必要的。


参考:
http://blog.csdn.net/hivon/archive/2008/04/23/2318760.aspx  Groovy探索之闭包 三
http://www.chinagroovy.org/groovywiki/doku.php/wiki:user_guide:closures Groovy文档翻译,什么是闭包

 

6
0
分享到:
评论

相关推荐

    groovy+in+action

    通过丰富的示例代码和深入浅出的讲解,读者可以全面掌握Groovy的核心概念和最佳实践。 #### 二、Groovy简介 Groovy是一种面向对象的动态编程语言,它运行在Java平台上,兼容Java语法并提供了一些增强特性,如闭包...

    Groovy中文版教程

    这本书深入浅出地讲解了Groovy的各个方面,包括基础语法、面向对象特性、元编程、领域特定语言(DSL)构建以及与Java的协作等。 1. **基础语法**:Groovy的语法与Java有很高的相似性,但更加灵活。例如,变量声明...

    Groovy学习资料(包括Groovy in action 的中英文以及API)

    Groovy in Action是一本权威的Groovy教程,由Dierk Koenig和Andrey Breslav等专家撰写,它深入浅出地介绍了Groovy的各个方面,是学习Groovy的必备参考书。 这本书分为多个部分,首先介绍Groovy的基础知识,包括语法...

    Groovy in Action源代码

    《Groovy in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Groovy编程语言,涵盖了Groovy的基础语法、高级特性以及在实际开发中的应用。源代码是书籍内容的实践部分,对于读者理解Groovy语言并进行实战...

    Groovy.for.Domain.Specific.Languages.pdf

    该书深入浅出地介绍了Groovy在DSL设计与实现中的独特优势,为读者提供了丰富的实践指导和理论基础。 ### Groovy与领域特定语言 #### 1. Groovy概述 Groovy是一种灵活、强大的脚本语言,它运行在Java平台上,能够...

    Groovy in Action 配套源码

    《Groovy in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Groovy编程语言,涵盖了从基础语法到高级特性的全方位内容。这本书的配套源码是学习和实践Groovy的重要资源,能帮助读者更好地理解书中的示例和...

    Grails+groovy 完整参考手册.7z

    - **书籍**:《Groovy编程:极简之道》和《Grails in Action》等书籍深入浅出地介绍了这两个技术。 通过阅读《Grails+groovy 完整参考手册.docx》,你可以更深入地了解这两个技术,包括它们的原理、最佳实践以及...

    Groovy in action

    《Groovy in Action》这本书是Groovy编程语言的权威指南,深入浅出地阐述了Groovy的各个方面,旨在帮助读者全面掌握这一强大的脚本语言。Groovy作为一种动态类型的语言,它在Java平台上运行,能够无缝集成Java代码,...

    Groovy InAction

    《Groovy InAction》是一本深受Groovy社区推崇的教程,它由Groovy官方网站推荐,继承了Action系列图书的一贯特点,深入浅出地讲解了Groovy编程语言的各个方面。这本书旨在帮助开发者全面掌握Groovy,提升在Java平台...

    Groovy In Action

    《Groovy In Action》这本书是Groovy编程语言的权威指南,深入浅出地介绍了这个Java平台上的强大脚本语言。Groovy,作为一种简洁、灵活且动态的开发语言,旨在提高开发效率,尤其在构建脚本、自动化任务、领域特定...

    groovy杂志 2008年11月

    总的来说,《Groovy杂志》2008年11月版是学习和进阶Groovy及Grails的宝贵资源,通过深入浅出的讲解和丰富的示例,无论是初学者还是经验丰富的开发者,都能从中受益匪浅。同时,配套的代码文件将理论与实践相结合,使...

    Groovy-in-Action-source-code

    《Groovy in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Groovy编程语言,这本书的源代码存档则为读者提供了实践和学习的宝贵资源。在这个压缩包中,你将找到与Groovy语言相关的各种示例、练习和项目...

    Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.Jun.2008

    《Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.Jun.2008》这本书深入浅出地介绍了Groovy语言和Grails框架,旨在帮助初学者快速掌握这两项技术并转化为专业人士。Groovy和Grails是Java生态中的...

    groovyInAction

    《Groovy in Action》是一本深受开发者欢迎的书籍,它深入浅出地介绍了Groovy编程语言的各个方面。Groovy是一种动态、灵活的面向对象的脚本语言,它为Java平台带来了许多新的特性和便利。这本书旨在帮助Java开发者...

    functional_groovy:NFJS上的“ Functional Groovy”演讲的示例

    这次演讲通过一系列示例脚本,深入浅出地展示了Groovy如何实现函数式编程,为开发者提供了一种全新的编程视角。 1. 函数式编程基础 函数式编程是一种编程范式,它强调使用纯函数和避免可变状态。Groovy虽然不是纯...

    GroovyInAction中英文对照合集

    《Groovy in Action》是一本深受开发者喜爱的书籍,它深入浅出地介绍了Groovy编程语言,这门语言是Java平台上的动态脚本语言,以其简洁的语法和强大的功能著称。这本书的中英文对照版提供了对Groovy的全面理解和学习...

    grails in action 2009

    在书中,作者深入浅出地介绍了Groovy语言的基本概念,包括语法特性、面向对象编程、闭包以及元编程等核心概念。Groovy的动态性和灵活性使得它在构建脚本、自动化任务和快速原型设计方面表现出色。学习Groovy,你可以...

    HelloGroovy

    《深入浅出Groovy编程语言:HelloGroovy的探索之旅》 Groovy,作为一种动态、灵活的编程语言,是Java平台上的一个强大工具。它在Java虚拟机(JVM)上运行,与Java代码无缝集成,同时提供了简洁的语法和强大的功能。...

    The definitive guide to grails 2 英文版 书 代码

    总的来说,《The Definitive Guide to Grails 2》是一本深入浅出的Grails教程,对于想要提升Grails技能的开发者来说,无论是初学者还是有一定经验的程序员,都能从中获益匪浅。通过阅读这本书并动手实践,你将能够...

Global site tag (gtag.js) - Google Analytics