>我需要将配置值的映射转换为如下所示的字符串:
{"键" => "值", "键2"=> "值2", ...}
有时一个值可能是配置值的另一个映射,因此对于该值,我需要类似递归回同一转换过程的东西,产生:
{..."key3" => {"子项" => "子值", ...}, ...}
我来自 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""}"
}
由于第一个方法调用第二个方法,第二个方法转身并回调到第一个方法,我不确定如何将其写成一个体面的闭包,我可以传递给初始收集调用......
使用递归:
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可以根据运行时的类型选择方法调用。你可以只定义两个函数:一个用于 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'}}"