我有一个Java Map<String,Object>
,我正在使用groovy的魔法来访问
myMap.property1.nestedProperty1.nestedNestedProperty
这很棒,我知道我可以像这样安全地导航:
myMap?.property1?.nestedProperty1?.nestedNestedProperty
但是,当我遍历巨大的分层嵌套地图时,记住始终保持安全的导航会变得乏味。
我认为groovy通过使用invokeMethod
覆盖实现了嵌套图导航。
对于我来说,建议修改默认行为以使其默认安全导航而又不必每次都?.
的最佳方法是什么?
我打算仅覆盖我的地图对象metaClass.invokeMethod
,而不覆盖第一类。
PS:我一直在徒劳地搜索groovy源代码。有人还能指出在Java Map实现上groovy到底在哪里实现了此功能吗?
答案 0 :(得分:1)
您可能会尝试使用ConfigObject,它已经具有这种“安全性”。
ConfigObject conf = myMap as ConfigObject
现在您可以执行conf.property1.nestedProperty1.nestedNestedProperty
,即使原始地图中缺少任何级别,它也将始终解决。
但是,完成后的结果(如果缺少任何部分)不是null
,而是isEmpty()
为true的ConfigObject。您可以根据需要使用instanceof
进行测试,因此:
myMap?.property1?.nestedProperty1?.nestedNestedProperty
等效于:
ConfigObject conf = myMap as ConfigObject
Object value = conf.property1.nestedProperty1.nestedNestedProperty
value = (value instanceof ConfigObject ) ? null: value
您可以很容易地编写一种更干净地执行上述操作的方法。
http://docs.groovy-lang.org/2.4.9/html/gapi/groovy/util/ConfigObject.html