Groovy 中的安全导航运算符

Posted

技术标签:

【中文标题】Groovy 中的安全导航运算符【英文标题】:Safe navigation operator in Groovy 【发布时间】:2012-03-13 15:15:26 【问题描述】:

我使用安全导航运算符来避免这样的 NPE

myInstance?.field1
myInstance?.field2
myInstance?.field3

为了在我写的for循环中转换上面的代码

<g:each var="i" in="$ (1..<4 ">
    myInstance['field'+i]
</g:each>

当我以 hashmap 格式检索值时,如何在上述代码中使用安全导航运算符? 我查看了文档here,但没有类似的示例。

【问题讨论】:

【参考方案1】:

我会使用这种语法:

myInstance?."field$i"

【讨论】:

这行得通,但是否有关于何时使用单引号和何时使用双引号的指南?我可以互换使用它们,但在这种情况下,只有双引号有效! 双引号之所以有效,是因为它与嵌入的表达式 ($i) 一起生成了一个 GString,并且通过这种方式动态获取属性或调用方法需要特殊处理。【参考方案2】:

你可以这样做:

<g:each var="i" in="$ (1..<4 ">
    $myInstance?."field$i"
</g:each>

或者,可能更好(并且在您的代码中更整洁)是 make this a tag 并像上面在纯 groovy 标记中那样做。

【讨论】:

以上是关于Groovy 中的安全导航运算符的主要内容,如果未能解决你的问题,请参考以下文章

安全导航运算符 (?.) 或 (!.) 和空属性路径

javascript 中是不是有空合并 (Elvis) 运算符或安全导航运算符?

Groovy 安全导航(safe-navigation)操作符(?.)

有没有可以在数组上使用的安全导航运算符之类的东西?

Groovy集合遍历 ( 调用集合的 every 方法判定集合中的所有元素是否符合闭包规则 | =~ 运算符等价于 contains 函数 | 代码示例 )

Groovy05_Groovy方法调用与运算符重载