Groovy Tip 18 Groovy的一些Map
在Groovy语言中,Map是一个大的家族,除了我们常用的HashMap以外,还有很多其他的形形色色的Map。当然,这些Map的存在是因为它们有不同于HashMap的地方。现在,我们就来看看其中的两种Map。
一.TreeMap
TreeMap是一种能够给Map对象的key排序的Map,下面举一个例子来看看就能明白。
def map = [3:'c',2:'b',1:'a',5:'e',4:'d']
def tm = new TreeMap(map)
println tm
运行的结果为:
[1:"a", 2:"b", 3:"c", 4:"d", 5:"e"]
可以看到,我们随便初始化的一个Map对象,经过TreeMap以后,它的key有有序起来。
通过运行结果,我们还可以看到,在默认的情况下,TreeMap对象里面的key是按顺序排序。
当然,既然是默认的情况,我们就可以改变这种默认的情况。我们可以给TreeMap设定一个自己的比较器,使得TreeMap对象的key按自己的要求排序。
def map = [3:'c',2:'b',1:'a',5:'e',4:'d']
def com = [compare:
{
a,b ->
a>b?-1:1
}] as Comparator
def tm = new TreeMap(com)
tm.putAll(map)
println tm
首先,我们定义了一个比较器compare,然后通过初始化把它传递给TreeMap对象。上面的代码的运行结果为:
[5:"e", 4:"d", 3:"c", 2:"b", 1:"a"]
可以看到,我们定义的比较器是倒序的,所以我们得到的结果也是倒序的。
二.ObservableMap
ObservableMap是一个更有趣的Map类,它可以监视客户端对Map对象的操作,我们先来看看下面的代码:
def om = [:] as ObservableMap
om.addPropertyChangeListener({
evt ->
println"add value: ${evt.newValue}"
} as PropertyChangeListener)
om."test" = 'eee'
可以看到,我们给Map对象添加了一个监听器,这使得我们可以监听器客户端对om对象的操作,如上面代码的运行结果为:
add value: eee
这有点类似我们的JavaBean。当我们在某种特殊情况下,需要把我们的Map对象里面的值自动由小写转化为大写的时候,这个方法就有可能用得上。