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 将元组/映射扩展为参数的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 groovy 中使用映射强制来模拟具有带参数的构造函数的类吗?