`
jamie.wang
  • 浏览: 347358 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

groovy简明教程(四)闭包

    博客分类:
  • Java
阅读更多

6. 闭包(Closure)

闭包其实就是一段代码,但他们又是封装成一个Closure对象。可以类比为java的内部类,或者更好的是C++中的函数对象又叫仿函数(functor)。

闭包使得groovy的代码看起来更简洁,精炼。另外闭包可以使得资源处理更为简便。

例如:

new File(/testfile.txt/).eachLine {println it} // eachLine handle file close automatically

 其中的it是闭包默认的变量名。

6.1 声明闭包

前面都是简单的在用的时候直接声明闭包,其实也可以将闭包复制给一个变量,便于多处使用,甚至引用一个已存在对象的方法。闭包也支持默认参数。

def linePrinter = {println it}  // assign to a variable
linePrinter('this line') // call

class Foo {
    void bar(int value) {
        println "call int bar(int value), with params: $value"
    }
    void bar(List lst) {
        println "call int bar(List lst), with params: $lst"
    }
    void bar(int x, int y) {
        println "call int bar(int x, int y), with params: $x, $y"
    }
}

Foo foo = new Foo()
foo.bar(10) // normal call
Closure cls = foo.&bar // reference to foo
cls(3) // call by overload detected
cls([1,5,7])
cls(1,2)

def benchmark(repeat, Closure alg) {
    start = System.currentTimeMillis();
    repeat.times { alg(it) }
    return System.currentTimeMillis() - start
}

slow = benchmark(10000) { (int) it / 2 }
fast = benchmark(10000, { it.intdiv(2) })

// intdiv is faster than /
System.out.println("slow - fast = " + (slow - fast)) // output: slow - fast = 20

// default value
def inc = { x, i = 1 -> return x + i }
println inc(3) // output: 4
println inc(5, 2) // output: 7

6.2 闭包自身的方法

还记得C++的函数适配器吗?groovy也提供了这样的方法为Closer:curry(),可接受一个或多个参数。

之前已经看到了isCase方法,以进行分类。

def multiply = { x, y -> return x * y }
multiply.getParameterTypes().size() // result: 2
def double_ = multiply.curry(2)
println double_(3) // output: 6

[1, 2, 8, 7, 3].grep { it % 2 == 0 } // result: [2, 8]
switch(8) {
    case { it > 3 } : println "> 3" // output: > 3
}

6.3 从闭包返回结果

闭包有两种返回结果的方式:

a. 返回最后一个表达式执行的结果,在这种情况下return是可以省略的;

b. 从闭包的任何地方返回,注意这种返回的意思是,本次计算结束,也就意味着如果闭包用在循环中,下次的循环的元素将继续被调用;

 

[1, 2, 3].collect { it * 2 } // same as: return it * 2,result: [2, 4, 6]
[1, 2, 3].collect {
    if ( it % 2 == 0) return it * 2 // end current computing
    return it
} // result: [1, 4, 3]

6.4 闭包的变量作用域

 关于变量的作用域,理解内部类就很容易理解了。我直接引用书上的一个例子,因为想不出更好的例子了。

注意:书上的一个错误:

class Mother {
    int field = 1
    int foo() {
        return 2
    }
    Closure birth (param) {
        def local = 3
        def closure = { caller ->
            [ this, field, foo(), local, param, caller, owner ] // error in book: this.owner
        }
        return closure
    }
}

Mother julia = new Mother()
closure = julia.birth(4)
context = closure.call(this)
println context[0] == julia // output: ture

println context[1..4] // output: [1, 2, 3, 4]
println context[5] instanceof Script // output: true
println context[6] == julia // output: true

firstClosure = julia.birth(4)
secondClosure = julia.birth(4)
println firstClosure.is(secondClosure) // output: false

 特别要注意到是最后一个输出false,每次调用birth都生成了一新的Closure对象。

 

分享到:
评论

相关推荐

    Groovy入门教程.doc

    此外,Groovy支持闭包(Closures),这是其强大的功能之一,可以用来创建函数式编程风格的代码。 Groovy还提供了许多其他特性,比如元编程(Metaprogramming)、领域特定语言(DSLs)构建能力,以及对Java库的无缝...

    Groovy入门教程[参照].pdf

    Groovy 入门教程 Groovy 是一种基于 Java 语言的脚本语言,运行在 JVM 中,语法与 Java 相似,但抛弃了 Java 的一些烦琐的语法规则,提供了更加简洁和灵活的编程体验。 Groovy 的特点 1. 简洁的语法:Groovy 语法...

    精通 Groovy 中文教程

    ### 精通Groovy中文教程 #### 一、Groovy简介 Groovy是一种动态语言,专门为Java平台设计,提供了一种更为简洁且灵活的语法结构。Groovy并不旨在取代Java,而是作为Java的一种补充,使得开发者能够在Java环境中...

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

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

    groovy基础教程源码,很全面

    Groovy基础教程源码涵盖了Groovy语言的各个方面,是学习和理解Groovy语言的宝贵资源。下面将详细阐述Groovy的一些核心知识点。 1. **动态类型与静态类型**: Groovy支持动态类型,这意味着变量在声明时无需指定...

    Groovy Script 入门

    #### 四、Groovy脚本进阶 ##### 4.1 类和对象 Groovy中的类定义类似于Java,但更简洁: ```groovy class Person { String name int age void sayHello() { println "Hello, my name is $name and I am $age...

    Groovy中文教程

    2. 支持闭包:Groovy的闭包类似于函数引用,可以作为参数传递,是函数式编程的重要组成部分。 3. 动态类型:Groovy允许不指定变量类型,它会在运行时自动推断。 4. GString:Groovy中的字符串支持占位符,如`"Hello,...

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

    在学习Groovy的过程中,掌握闭包这一核心概念至关重要,尤其是在重构流程控制语句和方法时。本讲我们将深入探讨如何将传统的流程控制结构和方法转换为Groovy的闭包,以提高代码的可读性和可维护性。 首先,让我们...

    Groovy中文教程.pdf

    ### Groovy中文教程知识点概述 #### 一、Groovy简介与快速入门 ##### 1.1 使用Groovy - **Groovy** 是一种基于 **Java虚拟机 (JVM)** 的编程语言,它提供了简洁的语法,并且兼容Java的类库。Groovy能够直接运行在...

    Groovy入门教程(一).docx

    此外,Groovy还支持闭包、元编程等高级特性,这些特性使得Groovy在处理脚本、自动化任务以及构建工具(如Gradle)时表现出色。 总之,Groovy是Java开发者的强大工具,它提供了更高效的编码方式,降低了学习曲线,...

    Groovy中文版教程

    此外,Groovy支持闭包,这是一种强大的代码块,常用于函数式编程。 2. **动态类型**:Groovy是动态类型的,这意味着变量的类型在运行时确定,而非编译时。这种特性使得开发过程更为敏捷,减少了类型检查带来的编译...

    Z2-Groovy in Action.pdf

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

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

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

    Groovy入门教程(一).pdf

    闭包是Groovy中的一个重要概念,它类似于匿名函数,可以作为参数传递,增强了代码的可读性和可维护性。 总之,Groovy是为那些希望提高开发效率,同时又不脱离Java生态系统的开发者设计的语言。它简化了Java的许多...

    groovy入门经典,groovyeclipse 插件

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

    groovy in action 中文版 2017.11

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

    Groovy DSL

    - **可扩展性**:作为Java的扩展,Groovy不仅可以与Java无缝集成,还可以利用其自身的特性(如闭包和动态类型)来增强现有的Java应用程序。 - **丰富的生态系统**:得益于其与Java的紧密联系,Groovy拥有一个庞大的...

Global site tag (gtag.js) - Google Analytics