【问题标题】:Accessing elements of a map of maps using a string in Groovy在 Groovy 中使用字符串访问地图的元素
【发布时间】:2013-07-02 23:44:59
【问题描述】:

鉴于我有这样的地图:

def myMap = [ b : [ c:"X" ] ]

还有一个字符串

def key = 'b.c'

我想看看我使用密钥获取值“X”的选项。

我自己想出了两种方法来实现这一点,但我对这些解决方案不太满意:

 1) Eval.me("theMap", myMap, "theMap.$key")
 2) mayMap."$key.split('\\.')[0]"."$key.split('\\.')[1]"

有人在 Groovy 中有更好的方法吗?

【问题讨论】:

  • 这个答案在任何方面有帮助吗?如果是,是否可以被其他人接受。

标签: map groovy


【解决方案1】:

一种方便的方法是使用实​​现 Map 的ConfigObject

def myMap = [b:[c:'X', d: 'Y'], a:[n:[m:[x:'Y']]]] as ConfigObject
def props = myMap.toProperties()

assert props['b.c'] == 'X'
assert props.'b.c' == 'X'
assert props.'a.n.m.x' == 'Y'

优点:

  • 不再分裂。
  • 不再评估。

【讨论】:

  • 应该注意,这似乎只在值是字符串时才有效;尝试使用 HashMap 列表,toProperties() 方法将列表转换为包含 toString() HashMap 版本的字符串。
  • 我不明白它比使用myMap['b.c'] 有什么优势?
【解决方案2】:

恕我直言,它不是ConfigObject,而是Properties(来自ConfigObject.toProperties())。看看并尝试:

def props = new ConfigSlurper().parse("""
b {
 c = 'X'
 d = 'Y'
}
a {
 n {
   m {
     x:'Y'
   }
 }
}""")

assert props['b.c'] == 'X'
assert props.'b.c' == 'X'
assert props.'a.n.m.x' == 'Y'
'passed'

断言失败:

assert props['b.c'] == 'X'
       |    |       |
       |    [:]     false
       [b:[c:X, d:Y], a:[n:[m:[:]]], b.c:[:]]

    at ConsoleScript7.run(ConsoleScript7:14)

我真的希望,ConfigObject 可以像上面这样的组合键索引

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多