1. 程式人生 > 實用技巧 >Groovy In Action 筆記 (7) -- Map相關

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 還可以將 方法呼叫的 () 省略