程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Groovy >> 在Groovy 1.0中使用閉包和集合

在Groovy 1.0中使用閉包和集合

編輯:Groovy

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做了一些修改和擴充。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved