gpt4 book ai didi

groovy - 属性的点字符串

转载 作者:行者123 更新时间:2023-12-02 02:22:37 25 4
gpt4 key购买 nike

我有一个与此类似的字符串哈希:

Map map = ['a.b.c': 'Hi']

...我需要在 gradle 中使用它来扩展这样的表达式:

This is a greeting: ${a.b.c}

如果我使用带有扩展的 gradle 复制任务,我将收到一条错误消息“没有这样的属性:a”。

有什么方法可以让 gradle/groovy 将该映射转换为我需要解析的属性吗?

最佳答案

我找不到内置的答案,但它是一个完整的、独立的方法,可以用作 Map 上的元方法来执行您想要的操作:

Map map = ['a.b.c': 'Hi', 'a.b.d': 'Yo', 'f.g.h': 'Howdy']

Map.metaClass.expandKeys = { separator = '.' ->
def mergeMaps = { a, b ->
b.each{ k, v ->
if(a[k] && (v instanceof Map)) {
mergeMaps(a[k], v)
} else {
a[k] = v
}
}
a
}
delegate.inject([:]){ result, k, v ->
mergeMaps(result, k.tokenize(separator).reverse().inject(v){last, subkey -> [(subkey):last] })
}
}

assert map.expandKeys() == [a:[b:[c:"Hi", d:"Yo"]], f:[g:[h:"Howdy"]]]

它还允许使用与 . 不同的分隔符,只需将分隔符传递到 expandKeys 方法

如果你想像普通函数一样使用它,那么你可以这样做:

Map map = ['a.b.c': 'Hi', 'a.b.d': 'Yo', 'f.g.h': 'Howdy']

def expandKeys = { Map input, separator = '.' ->
def mergeMaps = { a, b ->
b.each{ k, v ->
if(a[k] && (v instanceof Map)) {
mergeMaps(a[k], v)
} else {
a[k] = v
}
}
a
}
input.inject([:]){ result, k, v ->
mergeMaps(result, k.tokenize(separator).reverse().inject(v){last, subkey -> [(subkey):last] })
}
}

assert expandKeys(map) == [a:[b:[c:"Hi", d:"Yo"]], f:[g:[h:"Howdy"]]]

除了合并映射之外,主要技巧是拆分然后反转每个键。然后可以向后构建最终的层次结构。另外,可能有更好的方法来处理合并,因为我不喜欢末尾悬挂的 a

关于groovy - 属性的点字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com