使用Groovy中的字符串访问地图映射的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Groovy中的字符串访问地图映射的元素相关的知识,希望对你有一定的参考价值。

鉴于我有一张地图:

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的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'

优点:

  • 不再分裂。
  • 没有更多的评估。
另一答案

恕我直言,它不是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可以用上面这样的组合键索引

以上是关于使用Groovy中的字符串访问地图映射的元素的主要内容,如果未能解决你的问题,请参考以下文章

在 groovy 地图中获取密钥

列表的Groovy地图到地图列表

从 Map 擦除后访问指针

为啥 Groovy 的地图没有 metaClass?

Groovy集合声明与访问 ( 使用 [] 创建 ArrayList 和 LinkedList 集合 | 集合赋初值 | 使用下标访问集合 | 使用 IntRange 作为下标访问集合 )

通过 List 列中的常见字符串元素映射两个数据框