0

我有一张包含一堆值的地图

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

我想根据密钥是否以我传递的内容开头来提取值。IE

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"
4

2 回答 2

2

你可以这样做:

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

它将返回找到的所有值...

或者,如果您只查询一个

mymap.find { it.key.startsWith("FO") }.value
于 2013-07-16T17:54:21.833 回答
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'
于 2013-07-16T18:19:59.627 回答