【问题标题】:Return multiple values from map in Groovy?从 Groovy 中的地图返回多个值?
【发布时间】:2017-01-30 07:25:30
【问题描述】:

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

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

但是有没有一种方法可以轻松地返回多个值而不是条目列表?

更新:

我想做这样的事情(这是行不通的):

def values = map.{'name','blog'}

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

【问题讨论】:

  • 你能给我们举个例子吗?你希望结果是['mrhaki', true]吗?
  • 但是您可能仍然需要某种方式来指定要检索的键、值,对吧?
  • 那是地图,不是条目列表...
  • 我已经更新了问题
  • @Johan 检查我的答案,如果您正在寻找更简短的答案。

标签: groovy


【解决方案1】:
map.subMap(keys)*.value

展开运算符 (*.) 用于调用对所有项目的操作 一个聚合对象。相当于在每一个上调用动作 项目并将结果收集到列表中

【讨论】:

【解决方案2】:

您可以遍历子图并收集值:

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
}

【讨论】:

  • 所以没有像我在虚构示例中提出的那样从地图中提取多个值的“特殊语法”?
  • 我不这么认为。很确定您需要选择一种迭代器方法。
【解决方案3】:

为了完整起见,我将添加另一种使用Map.findResults 完成此操作的方法:

map.findResults { k, v -> k in keys ? v : null }

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

【讨论】:

    猜你喜欢
    • 2017-12-16
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    相关资源
    最近更新 更多