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 还可以将 方法调用的 () 省略