在Groovy中从映射返回多个值?

在Groovy中从映射返回多个值?,groovy,Groovy,假设我有一张这样的地图: def map = [name: 'mrhaki', country: 'The Netherlands', blog: true, languages: ['Groovy', 'Java']] def keys = ['name', 'blog'] map.subMap(keys) // Will return a map with entries name=mrhaki and blog=true 现在我可以返回“submap”,其中只包含“name”和“blo

假设我有一张这样的地图:

def map = [name: 'mrhaki', country: 'The Netherlands', blog: true, languages: ['Groovy', 'Java']]
def keys = ['name', 'blog']
map.subMap(keys)
// Will return a map with entries name=mrhaki and blog=true
现在我可以返回“submap”,其中只包含“name”和“blog”,如下所示:

def map = [name: 'mrhaki', country: 'The Netherlands', blog: true, languages: ['Groovy', 'Java']]
def keys = ['name', 'blog']
map.subMap(keys)
// Will return a map with entries name=mrhaki and blog=true
但是有没有一种方法可以轻松地返回多个值而不是一系列条目

更新:

我想做这样的事情(这不起作用):


这将产生例如
=
['mrhaki',true]
(一个列表或元组或一些其他数据结构)。

您可以迭代子映射并收集值:

def values = map.subMap(keys).collect {it.value}
// Result: [mrhaki, true]
或者,迭代键列表,返回该键的映射值:

def values = keys.collect {map[it]}
我想后者更有效,不必创建submap

在地图上迭代的更冗长的方式

def values = map.inject([]) {values, key, value -> 
    if (keys.contains(key)) {values << value}
    values
}
def values=map.injection([]){values,key,value->
if(keys.contains(key)){value
Spread运算符(*.)用于对所有项目调用操作
聚合对象。它相当于对每个对象调用操作
项并将结果收集到列表中


为了完整起见,我将添加另一种实现方法,使用:


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

你能给我们举个例子吗?你希望结果是
['mrhaki',true]
?但您可能仍然需要某种方法来指定要检索的键、值,对吗?这是一个映射,而不是条目列表…我已经更新了question@Johan如果你想找更短的答案,请检查我的答案。这样就没有“特殊语法”用于从映射中提取多个值,就像我在虚拟示例中建议的那样?我不这么认为。非常确定您需要选择一种迭代器方法。非常好。以下是文档:
map.findResults { k, v -> k in keys ? v : null }