我有一堆带有值的地图
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"
答案 0 :(得分:2)
你可以这样做:
mymap.findAll { it.key.startsWith("FO") }.values()
它将返回找到的所有值...
或者,如果您只查询一个
mymap.find { it.key.startsWith("FO") }.value
答案 1 :(得分:2)
正如你所说,只有一个条目,在这种情况下findResult
将是你最好的选择
mymap.findResult{k, v -> if(k.startsWith('FO')) return v}
此外,如果要使其为null安全,可以将默认值设置为
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'