六、閉包
??????? 閉包,英文叫Closure,是Groovy中非常重要的一個數(shù)據(jù)類型或者說一種概念 。閉包是指可以包含自由(未綁定到特定對象)變量的代碼塊;這些變量不是在這個代碼塊內(nèi)或者任何全局上下文中定義的,而是在定義代碼塊的環(huán)境中定義(局部變量)。“閉包”一詞來源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環(huán)境(作用域)。
??????? 1、Groovy閉包代碼定義格式
def c= {paramters -> code}
??????? 或者
def c= {無參數(shù),純code}? //這種case不需要->符號
???????? 2、定義代碼
/*閉包*/
def aClosure = {
//閉包是一段代碼,所以需要用花括號括起來..
String param1,intparam2 ->//這個箭頭很關(guān)鍵。箭頭前面是參數(shù)定義,箭頭后面是代碼
println"this is code"http://這是代碼,最后一句是返回值,也可以使用return,和Groovy中普通函數(shù)一樣
}
??????? 3、閉包定義好后,要調(diào)用它的方法就是:
??????? a、 閉包對象.call(參數(shù))? 或者更像函數(shù)指針調(diào)用的方法
aClosure.call("this is string",100)
??????? b、閉包對象(參數(shù))
aClosure("this is string",100)
??????? 結(jié)果都是
this is code
???????? 需要注意:
??????? 如果閉包沒定義參數(shù)的話,則隱含有一個參數(shù),這個參數(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ù)
def noParamClosure= { ->true}//noParamClosure("test")? <==報錯喔!
println(noParamClosure())//雖然沒有返回值,小括號必須有,否則打印Syntax$_main_closure3@6e9c45d0
??????? 結(jié)果:
true