如何在Groovy中从对象获取嵌套属性值?
考虑一下在Groovy中键入如何在Groovy中从对象获取嵌套属性值?,groovy,Groovy,考虑一下在Groovy中键入Company的情况: class Company { def name def contactPerson } 和联系人的联系人类型: class Contact { def firstName def lastName def email } 然后是Company类的实例: def stackOverflow = new Company( name: "Stack Overflow", contactPerson: new Cont
Company
的情况:
class Company {
def name
def contactPerson
}
和联系人的联系人
类型:
class Contact {
def firstName
def lastName
def email
}
然后是Company类的实例:
def stackOverflow = new Company(
name: "Stack Overflow",
contactPerson: new Contact(
firstName: "Joel",
lastName: "Spolsky",
email: "joel.spolsky@stackoverflow.com"
)
)
在Groovy中,我们有:
assert stackOverflow.contactPerson.firstName == "Joel"
或:
而且:
assert stackOverflow.name == "Stack Overflow"
或:
甚至:
def fieldName = 'name'
assert stackOverflow.${fieldName} == "Stack Overflow"
但假设我们有:
def nestedFieldName = 'contactPerson.firstName'
有没有一种很好的方法来实现这样的目标:
assert stackOverflow.${nestedFieldName} == "Joel"
一种方法是减少按键序列:
nestedFieldName.split('\\.')
.inject(stackOverflow) { object, property ->
object[property]
}
它返回'Joel'
,可用于读取任意深度的值
assert stackOverflow.${nestedFieldName} == "Joel"
nestedFieldName.split('\\.')
.inject(stackOverflow) { object, property ->
object[property]
}