`

Groovy闭包

阅读更多
Groovy闭包

闭包是一种表示可执行代码块的方法。闭包也是对象,可以像方法一样传递参数。由于闭包是代码块,因此也可以在需要时执行。像方法一样,在定义的过程中,闭包也可以使用一个或者多个参数。
一、inject方法
inject方法可用于遍历集合,首先将需要传递的值和集合项目传给闭包,此时其传递的值将作为处理结果,然后再和下一个集合项目一起传给闭包,依此类推。方法原型为:
Object inject(Object value, Closure closure)
例:求5的阶乘值
-----------
def factorial = [2,3,4,5].inject(1){previous, element -> previous * element}
println "Factorial(5): ${factorial}"
-----------

结果:
Factorial(5): 120
-----------
def fact = 1
[2,3,4,5].each{number -> fact *= number}
println "fact: ${fact}"
-----------

结果:
fact: 120
-----------
def list = [2,3,4,5]
factorial = list.inject(1){previous, element -> previous*element}
println "Factorial(5): ${factorial}"
-----------

结果:
Factorial(5): 120
-----------
list = [2,3,4,5]
def closure = {previous,element -> previous*element}
factorial = list.inject(1, closure)
println "Factorial(5): ${factorial}"
-----------

结果:
Factorial(5): 120

由于闭包也是一个对象,因此它可以作为方法的参数。
例:闭包作为方法的参数
-----------
//Find those items that qualify
def filter(list, predicate){
    return list.findAll(predicate)
}
//Two predicate closure
def isEven = {x -> return (x%2 == 0)}
def isOdd = {x -> return !isEven(x)}

def table = [11,12,13,14]

//Apply filter
def evens = filter(table, isEven)
println "evens: ${evens}"
def odds = filter(table, isOdd)
println "odds: ${odds}"
-----------

结果:
evens: [12, 14]
odds: [11, 13]

例:闭包作为另一个闭包的参数
-----------
//Find initial list that conforms to predicate
def takeWhile = {predicate,list ->
    def result = []
    for(element in list){
        if(predicate(element)){
            result<<element
        } else{
            return result
        }
    }
    return result
}
//Two predicate closures
def isEven = {x -> return x%2 == 0}
def isOdd = {x -> return !isEven(x)}
def table1 = [12,14,15,18]
def table2 = [11,13,15,16,18]
//Apply takeWhile
def evens = takeWhile.call(isEven, table1)
println "evens: ${evens}"
def odds = takeWhile.call(isOdd, table2)
println "odds: ${odds}"
------------

结果:
evens: [12, 14]
odds: [11, 13, 15]

例:闭包作为返回值
------------
def multiply(x){
    return {y -> return x*y}
}
def twice = multiply(2)
println "twice(4): ${twice(4)}"
//Closure returning a closure
def multiplication = {x -> return {y -> return x*y}}
def quadruple = multiplication(4)
println "quadruple(3): ${quadruple(3)}"
------------

结果:
twice(4): 8
quadruple(3): 12

例:选择性排序
------------
def selectionSort = {list ->
    def swap = {sList,p,q -> 
        def temp = sList[p]
        sList[p] = sList[q]
        sList[q] = temp
    }
    def minimumPosition = {pList,from ->
        def mPos = from
        def nextFrom = 1 + from
        for(j in nextFrom..<pList.size()){
            if(pList[j] < pList[mPos])
                mPos = j
        }
        return mPos
    }
    def size = list.size() - 1
    for(k in 0..size){
        def minPos = minimumPosition(list, k)
        swap(list, minPos, k)
    }
    return list
}
def table = [13,14,12,11,14]
def sorted = selectionSort(table)
println "sorted: ${sorted}"
------------

结果:
sorted: [11, 12, 13, 14, 14]
10
2
分享到:
评论
2 楼 jacktom 2008-05-08  
和JavaScript类似,但不同的地方太多,没法一一列举。
1 楼 KKFC 2008-05-06  
和JavaScript的写法有什么不同?

相关推荐

    Z2-Groovy in Action.pdf

    Groovy闭包可以像方法一样被调用,也可以作为参数传递给其他方法。闭包中可以自由地访问它被创建时作用域中的变量(闭包的自由变量)。这为Groovy的编程提供了很大的灵活性,例如可以轻松实现事件监听、回调函数、...

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

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

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

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

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

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

    groovy入门经典,groovyeclipse 插件

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

    groovy in action 中文版 2017.11

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

    Groovy Script 入门

    3. **闭包支持**:闭包是Groovy的一个强大特性,它可以像对象一样被传递和存储,用于实现高级编程模式。 4. **元编程**:Groovy支持元编程,可以通过反射机制修改程序的行为。 5. **简洁的语法**:Groovy具有简洁的...

    Grails A Quick-Start Guide:Dave Klein (DK)

    - **Groovy 闭包**:闭包是 Groovy 的一大特色,本书解释了闭包的概念以及如何在 Grails 中使用闭包编写简洁高效的代码。 - **Groovy 集合操作**:介绍了 Groovy 中集合的基本操作,以及如何利用这些特性来简化数据...

    apache-groovy-sdk-4.0.1下载

    - **闭包**:Groovy的闭包是强大的功能,可以用来实现函数式编程和回调机制,使得代码更加简洁和高效。 - **元编程**:Groovy允许在运行时修改类和对象的行为,这使得它非常适合构建框架和库,比如Grails web框架...

    groovy-2.3.6-installer

    Groovy的语法简洁明了,支持闭包和动态类型,使得开发效率大大提高。此外,Groovy还可以用于构建脚本、Web开发(如Grails框架)、自动化测试(Spock框架)、数据处理和集成等多种用途。 Groovy与Java的互操作性是其...

    Groovy轻松入门—搭建Groovy开发环境

    - **闭包**:Groovy的闭包是强大的功能,类似于函数指针,可以用于函数式编程。 - **GString**:Groovy中的字符串可以使用`${expression}`内嵌表达式,例如`"Hello, ${name}"`。 - **方法默认参数和命名参数**:...

    Groovy学习资料

    此外,Groovy还有闭包(Closure)的概念,这是Groovy强大的功能之一,它可以用来处理函数式编程任务,如数据过滤和映射。 其次,Groovy的动态特性是另一个关键知识点。Groovy可以在运行时改变类的结构,这意味着你...

    apache-groovy-sdk-3.0.6.zip

    7. **函数式编程支持**:Groovy支持闭包和高阶函数,这使得函数式编程风格在Groovy中变得非常自然,提高了代码的可读性和可维护性。 8. **动态和静态类型**:Groovy允许开发者在同一个项目中同时使用动态和静态类型...

    Groovy安装以及简单使用

    在Groovy中,`each`方法接收一个闭包作为参数,这个闭包对数组中的每个元素进行操作。上面的代码会打印出每个数字的两倍值。 Groovy与Java的集成非常紧密,可以通过`@groovy.transform.CompileStatic`注解实现静态...

    groovy

    3. 支持闭包:Groovy中的闭包类似于函数引用,可作为参数传递,有助于实现函数式编程风格。 4. GString:类似于Java的字符串,但支持占位符表达式,使字符串操作更便捷。 5. 链式调用:对象属性和方法可以连续调用,...

    某些必要的groovy

    3. **闭包(Closures)**:Groovy的闭包是其强大的特性之一,它类似于函数指针,可以作为参数传递,也可以作为返回值。闭包在处理集合操作、事件驱动编程或异步处理时非常有用。 4. **GroovyShell和...

    Groovy入门教程.doc

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

Global site tag (gtag.js) - Google Analytics