Groovy預覽--簡單的映射(maps)


1簡單的映射(maps)

一個map是用來給一個鍵(key)分配值(value)的強類型,map可以通過key存儲和找回valuea.
不像java,groovy在語言級別支持map,允許使用特定的操作符來操作map,maps的操作語法像鍵-值對數組,通過冒號分割key-valuea.
 
        
def http=[:]  //聲明一個map
println http.size()
http['syn']='Hello Synvata'//向map添加K-V
println http['syn']      
一般情況下key的類型都是字符串,在聲明map的時候可以忽略字符串標記(單引號或者雙引號): 
  assert ['a':1] == [a:1]
如果key沒有包括特殊的字符(需要符合有效標識符規則)並且不是groovy的關鍵字,那么允許通過這么便利的方式進行聲明。 這種方式也有不便的地方,例如,本地變量的內容被用作key。

假設有一個本地變量x,它的內容為‟a‟,由於[x:1]等價於['x':1],那么該怎樣保證它等於['a',1]呢?通過把符號放在圓括號中,強制讓groovy將符號看做為一個表達式:
  def x = 'a'
  assert ['x':1] == [x:1]  
  assert ['a':1] == [(x):1]
需要進行這樣的操作比較罕見,但是當需要從本地符號(本地變量、字段、屬性)得到一個key的時候,忘記插入圓括號可能導致錯誤。

2使用map操作符

使用map最簡單的操作是使用key存儲對象到map中和通過key從map中獲取對象。
  1.從map中獲取對象的一種可選方式是使用下標操作符,這基於map實現了getAt方法;
  2.另外一種可選方式是使用點語法像使用屬性那樣來獲取對象;
  3.第三種選擇是使用get方法,這個方法允許傳遞一個缺省值,在map沒有相應的key的時候允許返回這個值。如果沒有指定缺省值,null將為缺省,
   如果get(key,default)被調用時,key沒有找到並且缺省值被返回,那么key:default對將被增加到map中。
   將值分配給map時可以使用下標操作符或者點語法,在使用點語法的時候,如果key包含了特殊字符,需要使用字符串符號(單引號或者雙引號)圍起來,如下所示:
def myMap=[a:1, b:2, c:3]

assert myMap['a'] == 1
assert myMap.a == 1
assert myMap.get('a') == 1
assert myMap.get('a',0) == 1

assert myMap['d'] == null
assert myMap.d == null
assert myMap.get('d') == null

assert myMap.get('d',0) == 0
assert myMap.d == 0

assert myMap.get('e',1) == 1
assert myMap.e == 1


myMap = ['a.b':1] 
assert myMap.'a.b' == 1 
如果僅僅寫成myMap.a.b,在這里是不會正常工作的,這其實等價於myMap.getA().getB()。
keySet方法返回一個key的set集合,set是一個像list,但不包括重復的元素,並且集合中的元素沒有固定的順序,更詳細的信息請參考java.util.Set的JavaDoc,為了比較keySet是否與給定的list中的key,在這里將這個list轉換為一個set,這是通過方法toSet來實現的。
values方法返回map的值(value)的列表,由於map沒有辦法知道key的順序,因此不能了解value列表的順序,為了與預知的list中的值進行比較,在這里將兩個list都轉換為set。
def myMap=[a:1, b:2, c:2]
def toSet(list){
    new java.util.HashSet(list)
}
println toSet(myMap.values())  //[1, 2]

println myMap.keySet()         //[a, b, c]
 
         
         
        

Map的each方法接受兩種形式的閉包:傳遞一個參數給閉包,那么這個參數就是map的一個entry;傳遞兩個參數給閉包,那么參數就是key和value,一般來說,后者在實際工作中更方便。

def myMap=[a:1, b:2, c:2]
def store=''
myMap.each{entry ->
    store += entry.key
    store += entry.value
}
println store   //a1b2c2

store=''
myMap.each{key,value ->
    store += key
    store += value
}
println store   //a1b2c2

store=''
for(value in myMap.values()){
    store += value
}
println store  //122

最后,可以通過幾種不同的途徑來進行map內容的修改,可以通過原始的JDK的方法來移除元素,GDK引入的新的途徑如下:
通過給定一個key的集合來創建一個子map(subMap),這個子map的所有實體的key都來自這個集合;

findAll用來查找滿足閉包要求的所有map實體;

find用來查找任意一個滿足閉包要求的map實體,這里不像list那樣查找的是第一個滿足閉包要求的實體,這是因為map是沒有順序的;

collect為map的每一個實體應用閉包,返回每一個閉包應用的結果組成的list(閉包是否返回結果是可選的)

def myMap=[a:1, b:2, c:2]
myMap.clear()
assert myMap.isEmpty()

myMap=[a:1, b:2, c:3]
myMap.remove('a')
println myMap   //[b:2, c:3]


myMap=[a:1, b:2, c:3]
def sub=myMap.subMap(['a','b'])
println sub     //[a:1, b:2]


sub=myMap.findAll{entry -> 
    entry.value<3
}
println sub     //[a:1, b:2]

def found=myMap.find{entry -> entry.value < 3}
println found     // a=1
println found.key // a


def doubled=myMap.collect{entry -> entry.value *= 2 }
println doubled     // [2, 4, 6]

 

 




 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM