第二章 gradle自动化构建系列文章 之 Groovy中的Map
查看 “Android自动化构建系列” 全部文章
- Map的规范和list类似,与list一样,Map保证可以通过下标来获取或者设置值,不同的是map可以使用任何类型作为下标操作符的参数,而list仅仅支持整数,list知道list中元素的顺序,而map一般不知道,特殊的map如java.util.TreeMap也可以知道他们的key的顺序。
map的定义
//采用默认方式定义
def bmap=[a:12,b:30]
println bmap.toMapString()
println bmap.getClass()
运行结果:
map的key可以是任意类型的,通常是字符串类型或者number类型的,如果是字符串类型,应当使用单引号的不可变类型字符串,省略单引号时,编译器将自动转换为不可变字符串
默认定义的类型是 LinkedHashMap ,如果我们想要定义其他类型的
//采用强类型方式定义
TreeMap map =[a:12,b:20]
println map.toMapString()
println map.getClass()
def amap=[a:12,b:30] as TreeMap
println amap.toMapString()
println amap.getClass()
运行输出结果:
一般情况下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 ['(x)'] == ['x':1]
map获取
-
Groovy中有三种从map中获取对象的方法:
-
使用下表操作符,因为map实现了getAt方法;
-
使用点语法像使用属性那样来获取对象;
-
使用get()方法,可以传递一个缺省值,在map中没有相应的key时,允许返回缺省值,如果没有缺省值放回null,如果get(key,default)被调用时,key没有找到,缺省值返回,那么key:defualt对将被增加到map中。
def map == [a:1,b:2,c:3] assert map['a'] == 1 assert map.a == 1 assert map.get('a') == 1 assert map.get('a',0) == 1 assert map['d'] == null assert map.d == null assert map.get('d') == null assert map.get('d',0) == 0 assert map.d == 0 map['d'] = 1 assert map.d == 1 map.d = 2 assert map.d == 2
将值分配给map时可以使用下标操作符或者点语法,在使用点语法时,如果key包含了特殊字符,需要使用字符串符号括起来。
map = ["a.b" : 1] assert map.'a.b' == 1
-
如果仅仅写成map.a.b,这里是不会正常工作的,这其实等价于map.getA().getB().