考虑在Groovy中你有类型的情况Company
:
class Company {
def name
def contactPerson
}
Run Code Online (Sandbox Code Playgroud)
和contactPerson
的Contact
类型:
class Contact {
def firstName
def lastName
def email
}
Run Code Online (Sandbox Code Playgroud)
然后我们有公司类的实例:
def stackOverflow = new Company(
name: "Stack Overflow",
contactPerson: new Contact(
firstName: "Joel",
lastName: "Spolsky",
email: "joel.spolsky@stackoverflow.com"
)
)
Run Code Online (Sandbox Code Playgroud)
在Groovy中,我们很简单:
assert stackOverflow.contactPerson.firstName == "Joel"
Run Code Online (Sandbox Code Playgroud)
要么:
assert stackOverflow['contactPerson']['firstName'] == "Joel"
Run Code Online (Sandbox Code Playgroud)
并且:
assert stackOverflow.name == "Stack Overflow"
Run Code Online (Sandbox Code Playgroud)
要么:
assert stackOverflow['name'] == "Stack Overflow"
Run Code Online (Sandbox Code Playgroud)
甚至:
def fieldName = 'name'
assert stackOverflow.${fieldName} == "Stack Overflow"
Run Code Online (Sandbox Code Playgroud)
但是假设我们有:
def nestedFieldName = 'contactPerson.firstName'
Run Code Online (Sandbox Code Playgroud)
是否有Groovy方式来实现这样的事情:
assert stackOverflow.${nestedFieldName} == "Joel"
Run Code Online (Sandbox Code Playgroud)
?
一种方法是减少一系列键:
nestedFieldName.split('\\.')
.inject(stackOverflow) { object, property ->
object[property]
}
Run Code Online (Sandbox Code Playgroud)
返回'Joel'
,并可用于读取任意深度的值.