1、閉包 閉包是很多動(dòng)態(tài)語(yǔ)言提供的一個(gè)很方便的功能,它有點(diǎn)像Java中的內(nèi)部類,不同的是閉包中只有一個(gè)方法,但這個(gè)方法可以有任意個(gè)參數(shù)。
java 代碼 ? - def?closure?=?{?param?->?println("hello?${param}")?}??
- closure.call("world!")??
這段代碼會(huì)輸出”hello world”。
- 閉包用“{}”括起,“->”前面是參數(shù),后面是處理語(yǔ)句,可以使用call調(diào)用,也可以在“{}”后直接使用“()”來(lái)執(zhí)行。
- 閉包可以有多個(gè)參數(shù),各個(gè)參數(shù)用“,”隔開(kāi)。如果只有一個(gè)參數(shù)的話可以省略不寫,可以使用關(guān)鍵字“it”來(lái)代表。
我們可以把上面的例子像下面這樣寫:
java 代碼 ? - closure?=?{?println("hello?${it}")?}('world')??
或者
java 代碼 - closure?=?{?param1,param2->??
- ????????println(param1+param2)?}('hello?','world')??
上面的幾種寫法都會(huì)輸出“hello world”。
2、集合 (1)List
java 代碼 ? - def?list?=?[1,?2,?'hello',?new?java.util.Date()]??
- assert?list.size()?==?4??
- assert?list[1]==2??
- assert?list.get(2)?==?'hello'??
(2)Map
java 代碼 ? - def?map?=?['name':'James',?'location':'London']??
- assert?map.size()?==?2??
- assert?map.get('name')?==?'James'??
- assert?map['location']=='London'??
(3)循環(huán)
java 代碼 ? - def?list?=?[1,?2,?3]??
- for?(i?in?list)?{???
- ????print?i???
- }??
- println()??
- ??
- list.each{item->??
- ????print?item??
- }??
- println()??
- ??
- ['name':'yanhua','addr':'beijing'].each{println?it}??
- ['name':'yanhua','addr':'beijing'].each{key,value->println?"${key}?^_^?${value}"}??
上面的運(yùn)行的結(jié)果如下: 123 123 name=yanhua addr=beijing name ^_^ yanhua addr ^_^ beijing (4)collect 遍歷集合,逐個(gè)傳遞給閉包,處理后的結(jié)果返回給對(duì)應(yīng)的項(xiàng)。
java 代碼 - def?value?=?[1,?2,?3].collect?{?it?*?2?}??
- assert?value?==?[2,?4,?6]??
(5)find 根據(jù)閉包斷言,返回集合中找到的第一個(gè)項(xiàng)目。
java 代碼 - def?value?=?[1,?2,?3].find?{?it?>?1?}??
- assert?value?==?2??
(6)findAll 根據(jù)閉包斷言,返回集合中所有找到的項(xiàng)目。
java 代碼 - def?value?=?[1,?2,?3].findAll?{?it?>?1?}??
- assert?value?==?[2,?3]??
(7)inject 遍歷集合,第一次將傳遞的值和集合項(xiàng)目傳給閉包,將處理結(jié)果作為傳遞的值,和下一個(gè)集合項(xiàng)目傳給閉包,依此類推。
java 代碼 - def?value?=?[1,?2,?3].inject('counting:?')?{?str,?item?->?str?+?item?}??
- assert?value?==?"counting:?123"??
- value?=?[1,?2,?3].inject(0)?{?count,?item?->?count?+?item?}??
- assert?value?==?6??
(8)every 如果集合中所有項(xiàng)目都匹配閉包斷言,就返回true,否則返回false。
java 代碼 - def?value?=?[1,?2,?3].every?{?it?<?5?}??
- assert?value??
- value?=?[1,?2,?3].every?{?item?->?item?<?3?}??
- assert?!?value??
(9)any 如果集合中任何項(xiàng)目匹配閉包斷言,就返回true,否則返回false。
java 代碼 - def?value?=?[1,?2,?3].any?{?it?>?2?}??
- assert?value??
- value?=?[1,?2,?3].any?{?item?->?item?>?3?}??
- assert?value?==?false??
(10)min/max 返回集合中的最小/最大項(xiàng)目(對(duì)象必須可比較)。
java 代碼 - def?value?=?[9,?4,?2,?10,?5].max()??
- assert?value?==?10??
- value?=?[9,?4,?2,?10,?5].min()??
- assert?value?==?2?
- value?=?['x',?'y',?'a',?'z'].min()??
- assert?value?==?'a'??
(11)join 連接集合中的值成一個(gè)字符串。
java 代碼 - def?value?=?[1,?2,?3].join('-')??
- assert?value?==?'1-2-3'??
本文參考了http://blog.csdn.net/chenyun2000/archive/2004/09/15/104971.aspx這篇文章,針對(duì)Groovy1.0做了一些修改和擴(kuò)充。
|