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