2013-07-16 30 views
0

拉值我有一堆與價值觀如何從地圖

def mymap = [ 
"FOO" : "BAR", 
"something" : "else" 
] 

我想拔出基於價值的地圖是否與我傳遞什麼鍵啓動。即

mymap.findAll(it.key.startsWith("FO")} 

以上的回報{FOO=BAR}

如何修改它,這樣我只得到了價值BAR回來?

我試過,但我不想each,因爲我知道它會永遠只有一個值

def val = "" 
mymap.findAll(it.key.startsWith("FO")}.each{val = it.value} 
assert val == "BAR" 

回答

2

你可以這樣做:

mymap.findAll { it.key.startsWith("FO") }.values() 

它將返回所有值發現...

如果你只有一個查詢

mymap.find { it.key.startsWith("FO") }.value 
+0

'.values()'的作品,但不是'.value'或'.value的()' – Anthony

+0

傳播它:'* .value' – Will

2

正如你所說的,將只有一個入口,在這種情況下findResult將是你最好的選擇

mymap.findResult{k, v -> if(k.startsWith('FO')) return v} 

而且,如果你想讓它空安全,你可以設置默認值

mymap.findResult('default'){k, v -> if(k.startsWith('FO')) return v} 

如果你想收集所有這些值的列表,你將需要collectMany

mymap.collectMany{k, v -> k.startsWith('FO') ? [v] : []} 

樣品:

def mymap = ["FOO": "BAR", "something": "else", "FOOD": "Bread", "FOOL": "John Doe"] 

assert mymap.findResult{k, v -> if(k.startsWith('FO')) return v} == 'BAR' 
assert mymap.collectMany{k, v -> k.startsWith('FO') ? [v] : []} == ['BAR', 'Bread', 'John Doe'] 
assert mymap.findResult('default'){k, v -> if(k.startsWith('BLAH')) return v} == 'default'