假设我有这样的地图:
def map = [name: 'mrhaki', country: 'The Netherlands', blog: true, languages: ['Groovy', 'Java']]
现在我可以返回“submap”,只有“name”和“blog”,如下所示:
def keys = ['name', 'blog']
map.subMap(keys)
// Will return a map with entries name=mrhaki and blog=true
但有没有办法轻松返回多个值而不是条目列表?
更新
我想做这样的事情(这不起作用):
def values = map.{'name','blog'}
会产生例如values
= ['mrhaki', true]
(列表或元组或其他一些数据结构)。
答案 0 :(得分:6)
map.subMap(keys)*.value
Spread Operator(*。)用于对所有项目调用操作 聚合对象。它相当于在每个上调用动作 item并将结果收集到列表中
答案 1 :(得分:3)
您可以迭代子图并收集值:
def values = map.subMap(keys).collect {it.value}
// Result: [mrhaki, true]
或者,遍历键列表,返回该键的映射值:
def values = keys.collect {map[it]}
我猜测后者更有效率,无需创建子图。
迭代地图的更长篇的方法
def values = map.inject([]) {values, key, value ->
if (keys.contains(key)) {values << value}
values
}
答案 2 :(得分:1)
为了完整起见,我将使用Map.findResults添加另一种方法来完成此操作:
map.findResults { k, v -> k in keys ? v : null }
灵活,但比之前的一些答案更加冗长。