Groovy:在方法中展开命名映射参数

Groovy:在方法中展开命名映射参数,groovy,Groovy,我发现自己将许多变量作为命名参数传递给我的方法,因为这使事情变得更加清楚: doFunction(name: 'Jack', age: 27) 现在在doFunction中,我发现自己经常这样做: doFunction(Map args) { if (args['name']) { def name = args['name'] // do stuff with name } } 是否有一种语言功能可以动态地将地图展开到其各自的参数?我找不到那样的东西。如果没

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

doFunction(name: 'Jack', age: 27)
现在在doFunction中,我发现自己经常这样做:

doFunction(Map args) {

  if (args['name']) {
    def name = args['name'] 
    // do stuff with name 
  }
} 
是否有一种语言功能可以动态地将地图展开到其各自的参数?我找不到那样的东西。如果没有,我很好奇为什么,这似乎是对样板的自然Groovy方法。
我想要一种方法来立即检查并处理参数,如果它存在,有没有更干净的方法?我是不是完全走错了路

由于没有像clojure中那样的解构,使用这种贴图的一种方法是使用
。比如:

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中的参数)。它只是传递映射的一种语法糖。例如,它是
析构函数([name:'World'])
的缩写——它对方法
无效析构函数(字符串名,BigDecimal age)不起作用。

有趣!谢谢你挑剔的评论,你能告诉我Clojure做这件事的方法吗?在Clojure中,它类似于:
let[{:keys[name-age]}params]
。一个简单的示例是使用
Expando
作为您的超类,它基本上是一个映射支持的存储类。