Groovy Tip 31 Map拾遗
???????????????????????????????Groovy Tip 31 Map拾遗 ? ? 在Groovy语言中,Map类有了跟Java语言中的Map类的很大不同,这种不同导致了Groovy语言的Map类比起Java语言的Map相当简单,这些简单之处曾在很多地方提及。除此之外,Groovy语言的Map类还有一些值得注意的地方,要想熟练的使用Groovy语言的Map类对象,我们必须注意这些地方。 首先,当key为字符串时,该字符串是否加引号的效果一样。 如下面的语句: ? ??? ? println (['a':1]==[a:1]) ? 结果为: true ? 同样,下面的语句: ? ??? ? def map = ['a':1] ??? ? ??? ? println map.'a' ??? ? ??? ? println map.a ? ? 结果为: 1 1 ? 这就导致了一个问题:如果key是一个变量呢? ? ??? ? def? b = 'c' ??? ? ??? ? def m = [(b):3] ??? ? ??? ? println m."${b}" ? ? 可以看到,如果key是一个变量的话,可以使用小括号加变量名的表示法,如上面的"(b)"。 从上面的例子还可以看出,对于取值操作符"."来说,它的key都是字符串,无论key是否是否加上引号。如map.'a'和map.a都是用来取key值为"a"的值。如果key值的类型是非字符串类型,那么该如何取值呢? ? ??? ? def m1 = [1:'a'] ??? ? ??? ? println m1[1] ??? ? 对于Map对象的取值来说,Groovy语言也有一项比Java语言方便的地方,就是可以给取值语句赋默认值。即get(key,default),它的返回值为:如果Map对象中存在key值,则返回key值对应的value;如果Map对象中不存在key值,则返回default值。 ? ??? ? def map = [a:1,b:2,c:3] ??? ? ??? ? println map.get('a',0) ??? ? ??? ? println map.get('d',0) ??? ? 上面语句的结果为: 1 0 ? 取值语句还有一点需要注意,当key值字符串中有"."时,就不能使用下面的取值语句: ? ??? ? def map = ['a.b':1] ??? ? ??? ? println map.a.b ? ? 而要使用下面的取值语句: ? ??? ? println map.'a.b' ? ? 那么语句"map.a.b"又表示什么意思呢? ? ??? ? def m1 = [b:2] ??? ? ??? ? def m2 = [a:m1] ??? ? ??? ? println m2.a.b ? ? 上面的语句就能正常执行,当然,如果"m1"是一个GroovyBean对象,而"b"是该对象的一个属性,那么上面的取值语句也是可以正常执行的。 如果Map对象的value为闭包对象时,有文献说下面的语句会报错: ? ??? ? def map = [a:{println 'a'}] ??? ? ??? ? map.a() ? ? 而我们可以测试一下,却发现上面的语句是可以正常执行的。当然,下面的语句也是可以正常执行的: ? ??? ? (map.a)() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |