如何编写相互关联的方法/闭包;“Groovy”;路?

如何编写相互关联的方法/闭包;“Groovy”;路?,groovy,closures,Groovy,Closures,我需要将配置值映射转换为如下字符串: {“键”=>“值”,“键2”=>“值2”,…} 有时,一个值可能是配置值的另一个映射,因此对于该值,我需要类似于对同一转换过程的递归调用,生成: {…“键3”=>{“子键”=>“子值”,…},…} 我来自Java背景,正在努力找到正确的基于Groovy/闭包的方法来实现这一点。以下是我目前掌握的情况: static String toConfigString(Map config) { return "{${config.collect {toCon

我需要将配置值映射转换为如下字符串:

{“键”=>“值”,“键2”=>“值2”,…}

有时,一个值可能是配置值的另一个映射,因此对于该值,我需要类似于对同一转换过程的递归调用,生成:

{…“键3”=>{“子键”=>“子值”,…},…}

我来自Java背景,正在努力找到正确的基于Groovy/闭包的方法来实现这一点。以下是我目前掌握的情况:

static String toConfigString(Map config) {
    return "{${config.collect {toConfigEntryString(it)}.join(', ')}}"
}

static String toConfigEntryString(entry) {
    return "\"$entry.key\" => ${entry.value instanceof Map ? toConfigString(entry.value) : "\"$entry.value\""}"
}
由于第一个方法调用第二个方法,而第二个方法反过来又调用第一个方法,因此我不确定如何将其编写为一个合适的闭包,我可以使用递归将其传递给初始collect调用…

def map = [
    a: 1,
    b: 2,
    c: [
        d: 4, 
        e: [ f: 5, g: 7 ]
    ]
]

def convertToString(Map item) {
    item.collect { k, v ->
        v instanceof Map ? "{'$k' => ${convertToString(v).join(/, /)} }" : "{'$k' => '$v'}"
    } 
}

assert convertToString( map ).join(/, /) == 
 /{'a' => '1'}, {'b' => '2'}, {'c' => {'d' => '4'}, {'e' => {'f' => '5'}, {'g' => '7'} } }/
使用递归:

def map = [
    a: 1,
    b: 2,
    c: [
        d: 4, 
        e: [ f: 5, g: 7 ]
    ]
]

def convertToString(Map item) {
    item.collect { k, v ->
        v instanceof Map ? "{'$k' => ${convertToString(v).join(/, /)} }" : "{'$k' => '$v'}"
    } 
}

assert convertToString( map ).join(/, /) == 
 /{'a' => '1'}, {'b' => '2'}, {'c' => {'d' => '4'}, {'e' => {'f' => '5'}, {'g' => '7'} } }/

Groovy可以根据运行时的类型选择调用哪个方法。您可以定义两个函数:一个用于映射,一个用于所有其他情况,然后递归调用您的函数

def dump(object) {
  "'${object}'"
}
def dump(Map config) {
​​​​​​​​​​​​  '{' + ​config.collect { key, value -> "'${key}' => ${dump(value)}" }.join(", ")​​​​​​​​​​​​​​​​​​​​​ + '}'
}

def s = [a:"prop", b:[key:"value"]]
assert dump(s) == "{'a' => 'prop', 'b' => {'key' => 'value'}}"

Groovy可以根据运行时的类型选择调用哪个方法。您可以定义两个函数:一个用于映射,一个用于所有其他情况,然后递归调用您的函数

def dump(object) {
  "'${object}'"
}
def dump(Map config) {
​​​​​​​​​​​​  '{' + ​config.collect { key, value -> "'${key}' => ${dump(value)}" }.join(", ")​​​​​​​​​​​​​​​​​​​​​ + '}'
}

def s = [a:"prop", b:[key:"value"]]
assert dump(s) == "{'a' => 'prop', 'b' => {'key' => 'value'}}"

我不得不稍微调整一下您的示例,以便将大括号和逗号放在正确的位置,但这正是我所需要的。谢谢
def toLoginModuleString(Map-config){{{{'+config.collect{k,v->“\“$k\”=>”+(v-instanceof-Map?toLoginModuleString(v):“\“$v\”)}.join(',')+'}
我不得不稍微调整一下你的示例,以获得正确的大括号和逗号,但这正是我所需要的。谢谢<代码>def toLoginModuleString(映射配置){'{'+config.collect{k,v->“\”$k\”=>“+(映射的v实例?toLoginModuleString(v):“\”$v\”)}。连接(',')+'}