使用gstring访问list属性元素

时间:2014-04-10 16:24:14

标签: groovy

使用GStrings可以访问对象的属性,包括嵌套属性。但是如何访问list属性中的第n个元素?

class Foo {
   List<Bar> elements
}
class Bar {
  String version
}

我需要使用GString访问Foo.elements对象中的版本属性以获取特定索引。 在代码下面尝试没有成功。

def property = "elements[0].version"
fooObject."$property" fails to identify the property

2 个答案:

答案 0 :(得分:4)

因此,根据允许的灵活性,我认为有三种方法可以解决这个问题

class Foo {
   List<Bar> elements
}
class Bar {
  String version
}

假设fooObjectFoo的对象,例如:

def fooObject = new Foo(elements:[new Bar(version:1), new Bar(version:2)])
  1. 如果您可以:

    println fooObject."elements"[1]."version"
    
  2. 否则,将所有内容放入字符串中,然后进行插值:

    println "${fooObject.elements[1].version}"
    
  3. 最终,如果以上两种情况都不适合你:

    def property='elements[1].version'
    def expr = 'fooObject.' + property
    println Eval.me('fooObject', fooObject, expr)
    
  4. 最后一个将fooObject作为fooObject提供给正在评估的表达式并计算表达式。

答案 1 :(得分:1)

理想情况下,它可能是:

def prop1 = "elements"
def prop2 = "version"

fooObject."$prop1"[0]."$prop2"

冗长且通用的将使用inject

class Foo {
   List<Bar> elements
}
class Bar {
  String version
}

def fooObject = new Foo(elements: [new Bar(version: '1'), 
                                   new Bar(version: '2'), 
                                   new Bar(version: '3')])

def fetchVersion(property, fooObject) {
    property.tokenize(/./).inject(fooObject) {obj, elem -> 
        if(elem.contains(/[/)){
            def var = elem.tokenize(/[]/)
            obj?."${var[0]}".getAt("${var[1]}".toInteger()) 
        } else {
            obj?."$elem" 
        }
    }
}

assert fetchVersion("elements[0].version", fooObject) == '1'
assert fetchVersion("elements[1].version", fooObject) == '2'
assert fetchVersion("elements[2].version", fooObject) == '3'
assert fetchVersion("elements[7].version", fooObject) == null