Groovy 对于不使用';不存在?

Groovy 对于不使用';不存在?,groovy,Groovy,如果对象不存在,是否有类似“?”的东西可以返回null或false 这会引发一个错误: println doesntExist['sdfsd'​]​ 这不起作用,但有没有办法用“?”来得到布尔值 println doesntExist?['sdfsd'​]​ println doesntExist['sdfsd'​]​? println ?doesntExist['sdfsd'​]​ 有没有groovyier方法可以做到这一点: if (doesntExist && does

如果对象不存在,是否有类似“?”的东西可以返回null或false

这会引发一个错误:

println doesntExist['sdfsd'​]​
这不起作用,但有没有办法用“?”来得到布尔值

println doesntExist?['sdfsd'​]​
println doesntExist['sdfsd'​]​?
println ?doesntExist['sdfsd'​]​
有没有groovyier方法可以做到这一点:

if (doesntExist && doesntExist['sdfsd'​]​ ){}
您可以使用
get()
getAt()
方法,该方法相当于数组索引访问运算符:

def doesntExist = null

println doesntExist?.getAt('sdfsd')
println doesntExist?.get('sdfsd')
输出:

null
null
解释 如果编译的代码包含:

doesntExist['sdfsd']
打开它的反编译版本(例如,在IntelliJ IDEA中),您将看到该部分编译为

DefaultGroovyMethods.getAt(doesntExist, "sdfsd")
这就是为什么如果你想使用空安全操作符,你必须调用

doesntExist?.getAt('sdfsd')

直接。

cooolll。这是目前的观点,但这在groovy中被认为是一种标准方法吗?还是groovy的人认为这样做更具可读性?@red888不,这实际上是一个事实。Groovy将
doesntExist['sdfsd']
编译为
DefaultGroovyMethods.getAt(doesntExist,“sdfsd”)
,因此,如果要使索引运算符空值安全,必须进行此调用
doesntExist?.getAt('sdfsd')
直接调用。