Groovy 将元组/映射扩展为参数

Posted

技术标签:

【中文标题】Groovy 将元组/映射扩展为参数【英文标题】:Groovy expand tuple/map to arguments 【发布时间】:2012-11-07 02:56:51 【问题描述】:

是否可以将映射扩展为方法参数列表

在 Python 中是可能的,例如。 Expanding tuples into arguments

我有一个def map = ['a':1, 'b':2] 和一个方法def m(a,b)

我想像m(*map)这样写smt

【问题讨论】:

【参考方案1】:

spread operator (*) 用于将列表拆分为单个元素。这可用于调用具有多个参数的方法,然后将列表传播到参数的值中。

列表(Groovy 中的列表与 Python 中的元组关系最密切1,2):

list = [1, 2]
m(*list)

地图:

map = [a: 1, b: 2]
paramsList = map.values().toList()
m(*paramsList)

重要的一点是您按位置传递参数。

【讨论】:

你按位置传递参数..地图中元素的顺序是什么? 映射是从唯一的无序键到值的映射,但您可以使用 sort() 模拟 order by 子句,参见 Map documentation 我了解地图的工作原理,但有些是有序的,有些不是,有些是排序的,有些不是。例如:如果我有一个方法def m(a,b) 和一个映射def map = [b:1, a:2] 那么方法调用是什么-m(1,2)m(2,1) 或未定义...... 我不确定。我认为如果你有一个映射def map = [b:1, a:2] 方法调用是m(1,2) 但实现在未来可能会改变,这取决于引擎盖下使用的数据结构。 Groovy 文档说映射是值的无序键。您可以在此处了解有关此主题的更多信息:Sorted maps in groovy 与dictionaries in Python 的情况相同:dictionary 返回字典中使用的所有键的列表,按任意顺序(如果要对其进行排序,只需使用 sorted(d.keys ()) 代替)【参考方案2】:

目前我能想到的最好的是:

@groovy.transform.Canonical
class X 
  def a
  def b

  def fn( a, b ) 
    println "Called with $a $b"
  


def map = [ a:1, b:2 ]

def x = new X( map.values().toList() )

x.fn( map.values().toList() )

但是,在调用函数/构造函数时,这会考虑映射的顺序,而不是键的名称。

您可能想要添加一个采用 Map 的函数/构造函数,然后这样做

【讨论】:

*map 使用扩展运算符?我见过它只用在像map*.values()这样的方法上。如何理解上面的代码? 它从地图中获取values(),将它们转换为toList(),然后传播该列表。添加大括号可能会帮助您了解发生了什么:new X( *(map.values().toList()) ) 我不明白*map的用法。你可以简单地写map.values().toList() 并且工作正常! @ArturoHerrero 哈哈,哦,是的...* 是多余的:-/ @haridsv 地图传播运算符是 *: in groovy f(*:[a: 1, b: 2])【参考方案3】:
   mmap =  'a':1, 'b':2 

   def m( a, b ):
       return a+b
   print m( **mmap )

30

3

【讨论】:

这是在 Python 中的实现方式,但 Groovy 中不存在 ** 运算符

以上是关于Groovy 将元组/映射扩展为参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将元组类型转换为联合?

如何在Python中将列表扩展为函数参数[重复]

我可以在 groovy 中使用映射强制来模拟具有带参数的构造函数的类吗?

使用字典作为参数映射 Pandas 系列,其中值是元组

可变参数宏包装器,扩展为使用与参数数量相对应的字符格式化字符串

将元组作为命令行参数传递