六、閉包
??????? 閉包憨愉,英文叫Closure烦绳,是Groovy中非常重要的一個(gè)數(shù)據(jù)類型或者說(shuō)一種概念 。閉包是指可以包含自由(未綁定到特定對(duì)象)變量的代碼塊莱衩;這些變量不是在這個(gè)代碼塊內(nèi)或者任何全局上下文中定義的爵嗅,而是在定義代碼塊的環(huán)境中定義(局部變量)”恳希“閉包”一詞來(lái)源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對(duì)象沒(méi)有被釋放)和為自由變量提供綁定的計(jì)算環(huán)境(作用域)趟庄。
??????? 1括细、Groovy閉包代碼定義格式
def c= {paramters -> code}
??????? 或者
def c= {無(wú)參數(shù),純code}? //這種case不需要->符號(hào)
???????? 2戚啥、定義代碼
/*閉包*/
def aClosure = {
//閉包是一段代碼奋单,所以需要用花括號(hào)括起來(lái)..
String param1,intparam2 ->//這個(gè)箭頭很關(guān)鍵。箭頭前面是參數(shù)定義猫十,箭頭后面是代碼
println"this is code"http://這是代碼览濒,最后一句是返回值,也可以使用return拖云,和Groovy中普通函數(shù)一樣
}
??????? 3贷笛、閉包定義好后,要調(diào)用它的方法就是:
??????? a宙项、 閉包對(duì)象.call(參數(shù))? 或者更像函數(shù)指針調(diào)用的方法
aClosure.call("this is string",100)
??????? b乏苦、閉包對(duì)象(參數(shù))
aClosure("this is string",100)
??????? 結(jié)果都是
this is code
???????? 需要注意:
??????? 如果閉包沒(méi)定義參數(shù)的話,則隱含有一個(gè)參數(shù),這個(gè)參數(shù)名字叫it汇荐,和this的作用類似洞就。it代表閉包的參數(shù)。比如:
def greeting = {"Hello,$it!"}
assert greeting('Patrick') =='Hello, Patrick!'
等同于
def greeting = { it ->"Hello,$it!"}
assert greeting('Patrick') =='Hello, Patrick!'
??????? 結(jié)果:
Process finished with exit code 0
??????? 與此同時(shí):
??????? 如果在閉包定義時(shí)掀淘,采用下面這種寫(xiě)法旬蟋,則表示閉包沒(méi)有參數(shù)
def noParamClosure= { ->true}//noParamClosure("test")? <==報(bào)錯(cuò)喔!
println(noParamClosure())//雖然沒(méi)有返回值革娄,小括號(hào)必須有倾贰,否則打印Syntax$_main_closure3@6e9c45d0
??????? 結(jié)果:
true