Groovy In Action 笔记 (7) -- Map相关

Groovy中的Map默认为java.util.LinkedHashMap类, Groovy的编译器以及classloader会对此类型做特殊处理(后续详解),先看看map的基本操作:

/**
 * @author :ZackZhou
 * @date :Created in 2020/9/15 11:07 AM
 * @description :Groovy的Map操作
 * @modified By:
 * @version:
 */

def map = [:] //一个空map
assert map instanceof LinkedHashMap
println(map.getClass().name)

map << [a:2] // 添加含有一个kv的map, 默认key 为 String类型,也就是 a == "a", 在没有引号的情况下:这里要求 a 不能是Groovy中的关键字,或者含有特殊字符,如 . $ 等

assert map == ["a":2]

map << [b:3,c:4] // 添加含有多个kv的map
assert map == ["a":2,b:3,c:4]
assert map.size() == 3 //Groovy中统一的size方法

//获取指定key对应的value的不同方法
assert map["a"] == 2
assert map.a == 2
assert map."a" == 2

def key = 'a'
assert map."$key" == 2

map.x = 5 //相当于map.put("x",5)
assert map.x == 5
assert map.size() == 4
assert map == ["a":2,b:3,c:4,x:5] // groovy override了 == 操作
assert map == [(key):2,b:3,c:4,x:5] // 可以使用 (变量) 来代替key

map.'a.b.c' = 6
assert map == ["a":2,b:3,c:4,x:5,'a.b.c':6]

//map中的一些操作
def c_map = [a:1, b:2]
c_map.each {k,v -> println(k + " " + v)}
c_map.each {entry -> println(entry.key + " " + entry.value)} // 与上面一行相同
c_map.each {k,v -> c_map[k] = v * v} // double each value
assert c_map == [a:1,b:4]

def list_a = c_map.collect {k,v -> v} // 也可以是 {entry -> entry.value},或者直接用默认的it : {it.value}
assert list_a == [1,4]

def list_b = c_map.collect {k,v -> k + " " + v}
assert list_b == ["a 1","b 4"]


def people = [peter: 40, paul: 30, mary: 20]
assert people
        .findAll{ _, age -> age < 35 }  // 得到一个value 小于35的map
        .collect{ name, _ -> name.toUpperCase() } //得到一个list
        .sort()
        .join(', ') == 'MARY, PAUL'


//map作为形参的时候,方法调用可以省略 []
def map_parser(Map custom_map)
{
    custom_map.each {println(it.value)}
}

map_parser(a:1,b:2)
map_parser a:1,b:2 //groovy 还可以将 方法调用的 () 省略

 

posted @ 2020-10-09 13:06  ZackZhou  阅读(164)  评论(0编辑  收藏  举报