Groovy:在方法中展开命名的map参数

时间:2015-04-12 20:05:40

标签: groovy

我发现自己将很多变量作为命名参数传递给我的方法,因为它使事情变得更加清晰:

doFunction(name: 'Jack', age: 27)

现在在doFunction我经常发现自己这样做:

doFunction(Map args) {

  if (args['name']) {
    def name = args['name'] 
    // do stuff with name 
  }
} 

是否有语言功能可以动态地将Map解包到各自的参数中?我找不到那样的东西。如果没有,我很好奇为什么,这似乎是自然的Groovy方法的样板。 我想要一种方法来立即检查并处理参数(如果存在),是否有更简洁的方法来执行此操作?我完全以错误的方式接近地图论证吗?

1 个答案:

答案 0 :(得分:3)

因为没有像...在clojure中,使用with这样的地图的一种方法。像:

void destruct(Map params) {
    params.with{
        if (name) {
            println "Hello $name"
        }
        if (age) {
            println "I am $age years old"
        }
    }
}

destruct name: "World", age: 4.54e9
// => Hello World
// => I am 4.54E+9 years old
destruct name: "Computer"
// => Hello Computer

同样在挑剔方面:那些是没有命名参数(例如在python中)。它只是传递地图的语法糖。例如。它是destruct([name: 'World'])的缩写 - 它适用于方法void destruct(String name, BigDecimal age)