从现有变量创建映射(例如,相当于JavaScript的Java';s`{varA,varB,varC}`)

从现有变量创建映射(例如,相当于JavaScript的Java';s`{varA,varB,varC}`),java,groovy,Java,Groovy,我主要是一名JavaScript开发人员,但目前正在编写一些Groovy代码,还没有弄明白如何用JavaScript完成一些超级简单的事情 下面是我尝试做的JavaScript等价物 我特别想找出Java(或Groovy)等价于在JS中创建对象(Java中的映射)的方法,只使用现有的变量名,例如下面代码片段中的{a,b,c}速记。任何指导都将不胜感激 javaScriptExample() 函数javaScriptExample(){ //变量已经存在于我正在使用的程序中 常数a='a' 常数

我主要是一名JavaScript开发人员,但目前正在编写一些Groovy代码,还没有弄明白如何用JavaScript完成一些超级简单的事情

下面是我尝试做的JavaScript等价物

我特别想找出Java(或Groovy)等价于在JS中创建对象(Java中的映射)的方法,只使用现有的变量名,例如下面代码片段中的
{a,b,c}
速记。任何指导都将不胜感激

javaScriptExample()
函数javaScriptExample(){
//变量已经存在于我正在使用的程序中
常数a='a'
常数b='bee'
常数c='see'
//                ➡️ 这就是我被困的地方。⬅️  
//我只是希望能够任意传递变量键和值
//作为另一个函数的映射,只使用变量键,
//例如,下一次调用中JavaScript的{a,b,c}等价物
doOtherStuffWithVariables({a,b,c})
}
函数doOtherStuffWithVariables(obj){
用于(obj中的常量键){
log(`variable${key}的值为“${obj[key]}”,字符串长度为${obj[key].length}`)
}

}
不幸的是,对于JS中的
对象解构
,Groovy或Java中没有直接对应的对象。尽管您可以使用
映射文字
编写类似的代码:

def doStuff( Map obj ) {
  obj.each{ key, val -> 
    println "variable $key has a value of '${val}' and string length of ${obj[key].size()}" 
  }
}

def example(){
  def a = 'a'
  def b = 'bee'
  def c = 'see'

  doStuff( a:a, b:b, c:c )
}

我不确定你到底想做什么,但顺便说一句,java中没有类似的东西

您可以使用java集合库中的“新”方法:

    String a = "a";
    String b = "b";
    String c = "c";

    Map.of("a", a, "b", b, "c", c);
    List.of(a,b,c)
但是您应该记住,这些方法返回的是不可修改的对象


JavaDoc:返回包含三个元素的不可修改列表。有关详细信息,请参阅不可修改列表。

如上所述,Groovy中没有快捷方式。但是如果你想要/需要这个 语法,您可以使用

例如,非常直接的尝试:

@Macro
static Expression map(MacroContext ctx, final Expression... exps) {
    return new MapExpression(
        exps.collect{
            new MapEntryExpression(GeneralUtils.constX(it.getText()), it)
        }
    )
}
用法:

def a = 42
def b = 666

println(map(a,b))
// → [a:42, b:666]

如前所述,这在Groovy中是不可能的,因为只要在代码中使用变量
a
,就会传递该变量的值并忘记其名称。
但是,我还有一个解决方案,它涉及一个中间对象,该对象持有要查询的属性:

def toMap(obj) {
    obj.properties.collectEntries {
        [(it.key):it.value]
    }
}

def ex =
  new Expando().tap {
    a = 'A'
    b = 'B'
  }

assert toMap(ex) == [a:'A', b:'B']

与此功能相关。

结合使用
轻触
可以使重复消失tanks@cfrick以获得提示。我改编了我的例子。不幸的是,我们的环境太落后了,无法使用它,但它肯定是最符合我问题目标的,所以感谢你给了我希望!