9. Map
有時(shí)在其他語言中稱為字典或關(guān)聯(lián)數(shù)組挑辆,Groovy具有 Map 功能宾尚。
Map 將鍵與值相關(guān)聯(lián),用冒號(hào)分隔鍵和值有鹿,使用逗號(hào)分隔每個(gè)鍵/值對(duì)旭旭,以及用方括號(hào)括起的整個(gè)鍵和值谎脯。
// 我們定義了一個(gè)顏色名稱的 map葱跋,與它們的十六進(jìn)制編碼的 html 色值相映射
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
// 我們使用下標(biāo)符號(hào)來檢查與 red 鍵相關(guān)聯(lián)的內(nèi)容
assert colors['red'] == '#FF0000'
// 我們還可以使用屬性表示法來斷言顏色 green 的十六進(jìn)制表示
assert colors.green == '#00FF00'
// 我們可以使用下標(biāo)符號(hào)來添加新的鍵/值對(duì)
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 中不存在對(duì)應(yīng)的鍵废麻,則返回 null
荠卷。例如:
assert colors.unknown == null
在上面的例子中,我們用了字符串類型的鍵烛愧,你也可以使用其他類型的值作為鍵:
def numbers = [1: 'one', 2: 'two']
assert numbers[1] == 'one'
在這里油宜,我們使用數(shù)字作為鍵,因?yàn)閿?shù)字可以明確地被識(shí)別為數(shù)字怜姿,因此Groovy不會(huì)像我們之前的例子那樣創(chuàng)建字符串鍵慎冤。有種場(chǎ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')
您還可以傳遞帶引號(hào)的字符串以及鍵:["name": "Guillaume"]
。您的字符串鍵必需是有效的標(biāo)識(shí)符但狭,例如您想創(chuàng)建一個(gè)包含哈希的字符串鍵披诗,如:["street-name": "Main street"]
。
當(dāng)您需要在 map 定義中將變量值作為鍵傳遞時(shí)立磁,必須用括號(hào)括起變量或表達(dá)式:
// 這一次呈队,我們用括號(hào)括起key變量,讓解析器傳遞變量而不是定義字符串的鍵
person = [(key): 'Guillaume']
// map 包含 'name' 鍵
assert person.containsKey('name')
// map 不包含 'key' 鍵
assert !person.containsKey('key')