【问题标题】:How do I write inter-related methods/closures the "Groovy" way?如何以“Groovy”方式编写相互关联的方法/闭包?
【发布时间】:2016-06-01 05:59:42
【问题描述】:

我需要将配置值的 Map 转换为这样的字符串:

{"key" => "value", "key2" => "value2", ...}

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

{... "key3" => {"subkey" => "subvalue", ...}, ...}

我来自 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\""}"
}

由于第一个方法调用了第二个方法,而第二个方法转过来又回调到第一个方法,我不知道如何将其写成一个像样的闭包,我可以将其传递给初始收集调用...

【问题讨论】:

    标签: groovy closures


    【解决方案1】:

    使用递归:

    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 toLoginModuleString(Map config) { '{' + config.collect { k, v -> "\"$k\" => " + (v instanceof Map ? toLoginModuleString(v) : "\"$v\"") }.join(', ') + '}' }
    【解决方案2】:

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

    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'}}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 2013-05-24
      • 1970-01-01
      相关资源
      最近更新 更多