1、閉包 閉包是很多動態語言提供的一個很方便的功能,它有點像Java中的內部類,不同的是閉包中只有一個方法,但這個方法可以有任意個參數。
java 代碼 ? - def?closure?=?{?param?->?println("hello?${param}")?}??
- closure.call("world!")??
這段代碼會輸出”hello world”。
- 閉包用“{}”括起,“->”前面是參數,后面是處理語句,可以使用call調用,也可以在“{}”后直接使用“()”來執行。
- 閉包可以有多個參數,各個參數用“,”隔開。如果只有一個參數的話可以省略不寫,可以使用關鍵字“it”來代表。
我們可以把上面的例子像下面這樣寫:
java 代碼 ? - closure?=?{?println("hello?${it}")?}('world')??
或者
java 代碼 - closure?=?{?param1,param2->??
- ????????println(param1+param2)?}('hello?','world')??
上面的幾種寫法都會輸出“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)循環
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}"}??
上面的運行的結果如下: 123 123 name=yanhua addr=beijing name ^_^ yanhua addr ^_^ beijing (4)collect 遍歷集合,逐個傳遞給閉包,處理后的結果返回給對應的項。
java 代碼 - def?value?=?[1,?2,?3].collect?{?it?*?2?}??
- assert?value?==?[2,?4,?6]??
(5)find 根據閉包斷言,返回集合中找到的第一個項目。
java 代碼 - def?value?=?[1,?2,?3].find?{?it?>?1?}??
- assert?value?==?2??
(6)findAll 根據閉包斷言,返回集合中所有找到的項目。
java 代碼 - def?value?=?[1,?2,?3].findAll?{?it?>?1?}??
- assert?value?==?[2,?3]??
(7)inject 遍歷集合,第一次將傳遞的值和集合項目傳給閉包,將處理結果作為傳遞的值,和下一個集合項目傳給閉包,依此類推。
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 如果集合中所有項目都匹配閉包斷言,就返回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 如果集合中任何項目匹配閉包斷言,就返回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 返回集合中的最小/最大項目(對象必須可比較)。
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 連接集合中的值成一個字符串。
java 代碼 - def?value?=?[1,?2,?3].join('-')??
- assert?value?==?'1-2-3'??
本文參考了http://blog.csdn.net/chenyun2000/archive/2004/09/15/104971.aspx這篇文章,針對Groovy1.0做了一些修改和擴充。
|