閉包_是groovy語(yǔ)言的一個(gè)聲明函數(shù)的方式. 它有2個(gè)非常有趣的特性:
一是:是一個(gè)值(像一個(gè)string,number一樣)可以賦給一個(gè)變量
二是:在其類部可以使用可觸及范圍內(nèi)聲明的變量
1.聲明閉包
task groovy {}
def foo = "One million dollars"
def myClosure = {
????println "Hello from a closure"
????println "The value of foo is $foo"
}
myClosure() // 調(diào)用與函數(shù)調(diào)用一樣
def bar = myClosure // 又是一個(gè)值,可以賦值給變量
def baz = bar
baz()
2.對(duì)于參數(shù),閉包有另一種表示方式
????def doubleIt = { x -> x + x}
3.groovy語(yǔ)言是允許高階式函數(shù)編程,即可以將一個(gè)函數(shù)作為參數(shù)坐傳遞給別一個(gè)參數(shù)
def applyTwice(func, arg){
????????func(func(arg))
}
foo = 5
def fooDoubledTwice = applyTwice(doubleIt, foo)
println "Applying doubleIt twice to $foo equals $fooDoubledTwice"
4.對(duì)于List列表groovy有自己非常簡(jiǎn)單處理方式-用閉包
def myList = ["Gradle", "Groovy", "Android"] // 聲明一個(gè)list數(shù)據(jù)集
def printItem = {item -> println "List item: $item"} // 定義一個(gè)閉包,打印list中的每一個(gè)item元素
myList.each(printItem) // list.each(closure)函數(shù) 接受一個(gè)閉包
當(dāng)然,我們還可以更加簡(jiǎn)化這種表示方式,聲明閉包在一行里,去除兩個(gè)大括號(hào),除此之外
如果一個(gè)閉包接受的是單個(gè)參數(shù)的話,默認(rèn)情況,這個(gè)參數(shù)名稱用"it"表示,如下簡(jiǎn)化上例打印list的表示方式
? ?myList.each{println "Compactly printing each list item: $it"}?
5.類的聲名:groovy聲名一個(gè)類有非常簡(jiǎn)單的語(yǔ)法,groovy聲明的類底層本質(zhì)上就是java class,而groovy會(huì)自動(dòng)為其class的屬性會(huì)自動(dòng)生成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的最后一個(gè)特性是閉包可以有一個(gè)代理對(duì)象.任何在閉包中沒(méi)有在本地定義的變量或方法,可以通過(guò)代理對(duì)象進(jìn)行賦值
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