9. Map
有時(shí)在其他語言中稱為字典或關(guān)聯(lián)數(shù)組,Groovy具有 Map 功能。
Map 將鍵與值相關(guān)聯(lián),用冒號分隔鍵和值,使用逗號分隔每個(gè)鍵/值對,以及用方括號括起的整個(gè)鍵和值。
// 我們定義了一個(gè)顏色名稱的 map,與它們的十六進(jìn)制編碼的 html 色值相映射
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
// 我們使用下標(biāo)符號來檢查與 red 鍵相關(guān)聯(lián)的內(nèi)容
assert colors['red'] == '#FF0000'
// 我們還可以使用屬性表示法來斷言顏色 green 的十六進(jìn)制表示
assert colors.green == '#00FF00'
// 我們可以使用下標(biāo)符號來添加新的鍵/值對
colors['pink'] = '#FF00FF'
// 或者屬性表示法,添加 yellow
colors.yellow = '#FFFF00'
assert colors.pink == '#FF00FF'
assert colors['yellow'] == '#FFFF00'
assert colors instanceof java.util.LinkedHashMap
當(dāng)使用鍵的名稱時(shí),我們實(shí)際上在Map中定義了字符串鍵。Groovy創(chuàng)建的 map 實(shí)際上是java.util.LinkedHashMap的實(shí)例。
如果 map 中不存在對應(yīng)的鍵,則返回 null。例如:
assert colors.unknown == null
在上面的例子中,我們用了字符串類型的鍵,你也可以使用其他類型的值作為鍵:
def numbers = [1: 'one', 2: 'two']
assert numbers[1] == 'one'
在這里,我們使用數(shù)字作為鍵,因?yàn)閿?shù)字可以明確地被識別為數(shù)字,因此Groovy不會像我們之前的例子那樣創(chuàng)建字符串鍵。有種場景,你如果要傳遞一個(gè)變量代替鍵,讓該變量的值成為鍵:
// 與“Guillaume”名稱關(guān)聯(lián)的鍵實(shí)際上是“key”字符串,而不是與key變量關(guān)聯(lián)的值
def key = 'name'
def person = [key: 'Guillaume']
// map 不包含 'name' 鍵
assert !person.containsKey('name')
// map 包含 'key' 鍵
assert person.containsKey('key')
您還可以傳遞帶引號的字符串以及鍵:["name": "Guillaume"]。您的字符串鍵必需是有效的標(biāo)識符,例如您想創(chuàng)建一個(gè)包含哈希的字符串鍵,如:["street-name": "Main street"]。
當(dāng)您需要在 map 定義中將變量值作為鍵傳遞時(shí),必須用括號括起變量或表達(dá)式:
// 這一次,我們用括號括起key變量,讓解析器傳遞變量而不是定義字符串的鍵
person = [(key): 'Guillaume']
// map 包含 'name' 鍵
assert person.containsKey('name')
// map 不包含 'key' 鍵
assert !person.containsKey('key')