Map的规范与前面介绍的list的规范类似,很像list,map保证可以通过下标来获取值或者设置值,不同的是map可以使用任何类型作为下标操作符的参数,而list仅仅支持整数,list知道list中元素的顺序,而map一般不知道,特殊的map如java.util.TreeMap也可知道它们的key的顺序。
简单的map声明方式是使用方括号括起来相应的条目列表,这些条目列表通过逗号进行分隔,map的关键特性是map中的条目都是键值对(key-value),通过冒号分隔键与值:[key:value, key:value, key:value]
理论上,任何类型都可以用作map的键(key)或者值(value),当使用特殊的类型作为key的时候,需要遵循java.util.Map在javadoc中的规定。
通过“[:]”来声明一个空的map,map缺省的类型是java.util.HashMap,也可以通过调用构造方法进行显式声明,这样的map仍然可以使用下标操作符进行操作,事实上,这适合于任何类型的map,就像在列表4.1.1使用的java.util.TreeMap一样。
在列表4.11中,使用了来自java.util.Map的putAll(Map)方法来填充例子map,另外也可以通过TreeMap的构造方法传递myMap。
一般情况下key的类型都是字符串,在声明map的时候可以忽略字符串标记(单引号或者双引号):assert ['a':1] == [a:1]
如果key没有包括特殊的字符(需要符合有效标识符规则)并且不是groovy的关键字,那么允许通过这么便利的方式进行声明。
这种方式也有不便的地方,例如,本地变量的内容被用作key。假设有一个本地变量x,它的内容为‟a‟,由于[x:1]等价于[‘x’:1],那么该怎样保证它等于[‘a’,1]呢?通过把符号放在圆括号中,强制让groovy将符号看做为一个表达式:def x = 'a'
assert ['x':1] == [x:1]
assert ['a':1] == [(x):1]
需要进行这样的操作比较罕见,但是当需要从本地符号(本地变量、字段、属性)得到一个key的时候,忘记插入圆括号可能会导致错误。