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