从Groovy中的map返回多个值?

时间:2017-01-30 07:25:31

标签: groovy

假设我有这样的地图:

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](列表或元组或其他一些数据结构)。

3 个答案:

答案 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 }

灵活,但比之前的一些答案更加冗长。