1.3_Groovy 闭包和对象

2017-12-22  本文已影响19人  Android_Dev

闭包_是groovy语言的一个声明函数的方式. 它有2个非常有趣的特性:

一是:是一个值(像一个string,number一样)可以赋给一个变量

二是:在其类部可以使用可触及范围内声明的变量

1.声明闭包

task groovy {}

def foo = "One million dollars"

def myClosure = {

    println "Hello from a closure"

    println "The value of foo is $foo"

}

myClosure() // 调用与函数调用一样

def bar = myClosure // 又是一个值,可以赋值给变量

def baz = bar

baz()

2.对于参数,闭包有另一种表示方式

    def doubleIt = { x -> x + x}

3.groovy语言是允许高阶式函数编程,即可以将一个函数作为参数坐传递给别一个参数

def applyTwice(func, arg){

        func(func(arg))

}

foo = 5

def fooDoubledTwice = applyTwice(doubleIt, foo)

println "Applying doubleIt twice to $foo equals $fooDoubledTwice"

4.对于List列表groovy有自己非常简单处理方式-用闭包

def myList = ["Gradle", "Groovy", "Android"] // 声明一个list数据集

def printItem = {item -> println "List item: $item"} // 定义一个闭包,打印list中的每一个item元素

myList.each(printItem) // list.each(closure)函数 接受一个闭包

当然,我们还可以更加简化这种表示方式,声明闭包在一行里,去除两个大括号,除此之外

如果一个闭包接受的是单个参数的话,默认情况,这个参数名称用"it"表示,如下简化上例打印list的表示方式

   myList.each{println "Compactly printing each list item: $it"} 

5.类的声名:groovy声名一个类有非常简单的语法,groovy声明的类底层本质上就是java class,而groovy会自动为其class的属性会自动生成getter和setter方法

class GroovyGreeter {

    String greeting = "Default greeting"

    def printGreeting(){println "Greeting: $greeting"}

}

def myGroovyGreeter = new GroovyGreeter()

myGroovyGreeter.printGreeting()

myGroovyGreeter.greeting = "My custom greeting"

myGroovyGreeter.printGreeting()

6.groovy的最后一个特性是闭包可以有一个代理对象.任何在闭包中没有在本地定义的变量或方法,可以通过代理对象进行赋值

def greetingClosure = {

    greeting = "Setting the greeting from a closure"

    printGreeting()

}

// greetingClosure() // This doesn't work, because `greeting` isn't defined

greetingClosure.delegate = myGroovyGreeter

greetingClosure() // This works as `greeting` is a property of the delegate

更多资料,如下连接

http://learnxinyminutes.com/docs/groovy/

http://www.groovy-lang.org/documentation.html

上一篇下一篇

猜你喜欢

热点阅读