在Groovy中,有没有办法安全地索引到类似于安全导航操作符的Collection?

Kyl*_*yle 22 groovy

这将安全地返回null而不会抛出任何异常

obj?.prop1?.prop2
Run Code Online (Sandbox Code Playgroud)

我如何为集合执行此操作,它不会抛出索引超出范围的异常?

myarray[400]  //how do I make it return null if myarray.size() < 400 
Run Code Online (Sandbox Code Playgroud)

收藏有这样的运营商吗?

ata*_*lor 41

这是除了groovy中的数组之外的所有集合的默认行为.

assert [1,2,3,4][5] == null
def test = new ArrayList()
assert test[100] == null
assert [1:"one", 2:"two"][3] == null
Run Code Online (Sandbox Code Playgroud)

如果您有一个数组,请将其强制转换为列表.

def realArray = new Object[4]
realArray[100] // throws exception
(realArray as List)[100] // null
Run Code Online (Sandbox Code Playgroud)

您可以?使用与属性相同的方式将列表和映射索引与运算符串联起来:

def myList = [[name: 'foo'], [name: 'bar']]
assert myList[0]?.name == 'foo'
assert myList[1]?.name == 'bar'
assert myList[2]?.name == null
Run Code Online (Sandbox Code Playgroud)

  • 但要注意会导致异常的负面指数,即:`def a = []; println a [-1]`抛出`java.lang.ArrayIndexOutOfBoundsException` (6认同)
  • 对于像我这样寻找此内容的任何常规菜鸟来说,如果您需要对变量键名进行映射访问,您可以使用此语法来利用空安全运算符: `mymap = null` `keyName = "WTF"` ` mymap?."$keyName"` (2认同)