在Groovy1.0中使用閉包和集合

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'  
本文參考了[url]http://blog.csdn.net/chenyun2000/archive/2004/09/15/104971.aspx[/url]這篇文章,針對Groovy1.0做了一些修改和擴充。
本文最初發表在:[url]http://yanhua.javaeye.com/blog/68164[/url]上。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章