將對象組織到像列表和映射這樣的數據結構中是一項基本的編碼任務。像大多數語言一樣,Groovy 定義了一個豐富的庫以管理這些類型的集合。
列表
創建一個列表與在 Java 語言中創建一個數組很類似。
collect = ['groovy', 29, 'Hello', 'Groovy']empty=[]
assert empty.size() == 0
//添加元素
empty.add 1
assert empty.size() == 2
在上面的例子里,列表 collect 的第二項自動裝箱為一個 Integer 類型。此外“[]”表示一個空列表,這個例子還演示了如何向列表中添加元素。
Groovy 還為集合增加了幾個新方法,這些方法使得對列表的一些操作變得更加容易,如統計值出現的次數、將整個列表結合到一起、對列表排序等等。可以在例2 中看到這些集合方法的使用。
collect = [5, 9, 2, 2, 4, 5, 6]
println collect.join(' - ') // prints 5 - 9 - 2 - 2 - 4 - 5 - 6
println collect.count(2) // prints 2
println collect.sort() // prints [2, 2, 4, 5, 5, 6, 9]
Maps
像列表一樣,映射也是一種在 Groovy 中非常容易處理的數據結構。例 3 中的映射包含兩個對象,鍵是 name 和 date。注意可以用不同的方式取得值。 可以用“[:]”創造一個空的映射。
myMap = ["name" : "Groovy", "date" : new Date()]
println myMap["date"]
println myMap.date
Map可以象beans一樣操作,但key值(類似屬性名)必須為有效的String標識。下面的例子詳細演示了Map的用法。
map = ["name":"Gromit", "likes":"cheese", "id":1234]
assert map.name == "Gromit"
assert map.id == 1234
//Create an empty maps
emptyMap = [:]
assert emptyMap.size() == 0
emptyMap.foo = 5
assert emptyMap.size() == 1
assert emptyMap.foo == 5
emptyMap.put("bar",6)
assert emptyMap.get("bar") == 6players = ['baseball':'Albert Pujols', 'golf':'Tiger Woods']
println players['golf'] // prints Tiger Woods
println players.golf // prints Tiger Woods
for (player in players)
{
println "${player.value} plays ${player.key}"
}
// This has the same result as the previous loop.
players.each {
player |println "${player.value} plays ${player.key}"
}
范圍
范圍(Range)是Groovy的一大亮點Range允許創建連續值的列表。范圍是一個很直觀的概念,并且容易理解,利用它可以包含地或者排除地創建一
組有序值。使用“..”的Range是包括兩個邊界,使用“..<”(Groovy Beta3使用
“...”)的Range只包括開始邊界,而不包括結束邊界。
而且由于Range擴展java.util.List,所以Range可以作為List使用。
myRange = 29..<32
myInclusiveRange = 2..5
println myRange.size() // prints 3
println myRange[0] // prints 29
println myRange.contains(32) //prints false
println myInclusiveRange.contains(5) //prints true// an inclusive range and operations
range = 'a'..'d'
assert range.size() == 4
assert range.get(2) == 'c'
assert range instanceof java.util.List
assert range.contains('a')
assert range.contains('d')
assert ! range.contains('e')
迭代器
迭代是各種編程環境中最常見、最有用的技術。迭代器可以讓您迅速地訪問任何集合或容器中的數據,每次一個數據。Groovy 把迭代器變成隱含的,使用起來更簡單,從而改善了 Java 語言的迭代器概念。
我們可以直接在集合上使用類似迭代器的方法。而且, Groovy 的迭代器方法接受閉包,每個迭代中都會調用閉包。
class IteratorExample1{
static void main(args) {
coll = ["JMS", "EJB", "JMX"]
coll.each{ item | println item }
}
}
范圍可以用于循環遍歷。例如,將 rang 定義為一個排除范圍,循環打印 a、b、c 和 d。
aRange = 'a'..<'e'
for (i in aRange){
println i
}
集合的其他功能
如果不熟悉 Python 和其他腳本語言,那么您在 Groovy 集合中發現的一些其他功能會讓您印象深刻。例如,創建了集合后,可以用負數在列表中反向計數:
aList = ['python', 'ruby', 'groovy']
println aList[-1] // prints groovy
println aList[-3] // prints python
Groovy 還讓您可以用范圍分割列表。分割可獲得列表的準確子集:
fullName = "Andrew James Glover"
mName = fullName[7..<13]
println "middle name: " + mName // prints James
Ruby的語法
集合類似于 Ruby如果愿意的話,還可以將 Groovy 集合作為 Ruby 集合。可以用類似 Ruby 的語法,以 << 語法附加元素、用 + 串接和用 - 對集合取差,甚至還可以用 * 語法處理集合的重復。 注意,還可以用 == 比較集合。
collec = [1, 2, 3, 4, 5]
collec << 6 //appended 6 to collecacol = ['a','b','c'] * 3 //acol now has 9 elements
coll = [10, 11]
coll2 = [12, 13]
coll3 = coll + coll2 //10,11,12,13
difCol = [1,2,3] - [1,2] //difCol is 3
assert [1, 2, 3] == [1, 2, 3] //true
集合的索引
可以在字符串、Lists、Maps...中使用下標進行索引
text = "nice cheese gromit!"
x = text[2]
assert x == "c"
assert x.class == Stringsub = text[5..10]
assert sub == 'cheese'
map = ["name":"Gromit", "likes":"cheese", "id":1234]
assert map['name'] == "Gromit"
list = [10, 11, 12]
answer = list[2]
assert answer == 12
list = 100..200
sub = list[1, 3, 20..25, 33]
assert sub == [101, 103, 120, 121, 122, 123, 124, 125, 133]
可以使用下標操作符更新項目:
list = ["a", "b", "c"]
list[2] = "d"
list[0] = list[1]
list[3] = 5
assert list == ["b", "b", "d", 5]
可以使用負索引從最后開始計數:
text = "nice cheese gromit!"
x = text[-1]
assert x == "!"
name = text[-7..-2]
assert name == "gromit"
也可以使用向后范圍(開始索引大于結束索引),返回的結果是反轉的
text = "nice cheese gromit!"
name = text[3..1]
assert name == "eci"
// 山風小子注:closure中的‘分隔符’應該為 -> 而不是|,后者已經被廢棄。
原文地址:http://blogger.org.cn/blog/more.asp?name=lhwork&id=20812
附:Groovy與Grails同甘共苦,苦盡甘來
posted on 2007-04-22 22:24
山風小子 閱讀(1878)
評論(0) 編輯 收藏 所屬分類:
Groovy & Grails