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

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

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

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

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

【问题讨论】:

    标签: groovy arguments parameter-passing


    【解决方案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 中不存在 ** 运算符
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-07-04
    • 2010-10-21
    相关资源
    最近更新 更多