1、閉包
閉包是很多動態語言提供的一個很方便的功能,它有點像Java中的內部類,不同的是閉包中只有一個方法,但這個方法可以有任意個參數。
閉包是很多動態語言提供的一個很方便的功能,它有點像Java中的內部類,不同的是閉包中只有一個方法,但這個方法可以有任意個參數。
java 代碼
def closure = { param -> println("hello ${param}") }
closure.call("world!")
這段代碼會輸出”hello world”。
closure.call("world!")
這段代碼會輸出”hello world”。
閉包用“{}”括起,“->”前面是參數,後面是處理語句,可以使用call調用,也可以在“{}”後直接使用“()”來執行。
閉包可以有多個參數,各個參數用“,”隔開。如果只有一個參數的話可以省略不寫,可以使用關鍵字“it”來代表。
我們可以把上面的例子像下面這樣寫:
閉包可以有多個參數,各個參數用“,”隔開。如果只有一個參數的話可以省略不寫,可以使用關鍵字“it”來代表。
我們可以把上面的例子像下面這樣寫:
java 代碼
closure = { println("hello ${it}") }('world')
或者
或者
java 代碼
closure = { param1,param2->
println(param1+param2) }('hello ','world')
上面的幾種寫法都會輸出“hello world”。
closure = { param1,param2->
println(param1+param2) }('hello ','world')
上面的幾種寫法都會輸出“hello world”。
2、集合
(1)List
(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
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)循環
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
遍歷集合,逐個傳遞給閉包,處理後的結果返回給對應的項。
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
根據閉包斷言,返回集合中找到的第一個項目。
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
根據閉包斷言,返回集合中所有找到的項目。
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
遍歷集合,第一次將傳遞的值和集合項目傳給閉包,將處理結果作爲傳遞的值,和下一個集合項目傳給閉包,依此類推。
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。
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。
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
返回集合中的最小/最大項目(對象必須可比較)。
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
連接集合中的值成一個字符串。
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'
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]上。