在Groovy中,是否有任何方法可以安全地索引到类似于安全导航操作符的集合中?

在Groovy中,是否有任何方法可以安全地索引到类似于安全导航操作符的集合中?,groovy,Groovy,这将安全地返回null,而不会引发任何异常 obj?.prop1?.prop2 对于集合,我如何才能做到这一点,因为它不会抛出索引越界异常 myarray[400] //how do I make it return null if myarray.size() < 400 myarray[400]//如果myarray.size()小于400,如何使其返回null 集合是否有这样的运算符?这是groovy中除数组之外的所有集合的默认行为 assert [1,2,3,4][5]

这将安全地返回null,而不会引发任何异常

obj?.prop1?.prop2
对于集合,我如何才能做到这一点,因为它不会抛出索引越界异常

myarray[400]  //how do I make it return null if myarray.size() < 400 
myarray[400]//如果myarray.size()小于400,如何使其返回null

集合是否有这样的运算符?

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

assert [1,2,3,4][5] == null
def test = new ArrayList()
assert test[100] == null
assert [1:"one", 2:"two"][3] == null
如果你有一个数组,把它放到一个列表中

def realArray = new Object[4]
realArray[100] // throws exception
(realArray as List)[100] // null
您可以将列表和映射索引与
运算符按与属性相同的方式组合在一起:

def myList = [[name: 'foo'], [name: 'bar']]
assert myList[0]?.name == 'foo'
assert myList[1]?.name == 'bar'
assert myList[2]?.name == null
您可以改为使用get():


但要注意会导致异常的负指数,即:
defa=[];println a[-1]
抛出一个
java.lang.ArrayIndexOutOfBoundsException
@tim_yates知道为什么吗?似乎有点不一致。像我这样的groovy noobs的附录正在寻找这一点,如果您需要对变量键名进行映射访问,您可以使用此语法利用空安全运算符:
mymap=null
keyName=“WTF”
mymap?“$keyName”
请注意:
test[100]
返回
null
,但
test.get(100)
抛出
IndexOutOfBoundsException
。与
test?相同。get(100)
如果索引确实超出范围,则会抛出
IndexOutOfBoundsException
,这实际上比返回
null
myarray[400]
的当前行为更糟糕。实际上,您是对的。但是,myarray?.getAt(400)如果超出范围将返回null。对于哪个版本的Groovy?我已经用2.4.13、2.4.6、2.0.0和1.7.8进行了测试。这是不正确的。
只有在
myarray
为空时才有帮助。如果
myarray
为空,则表达式的计算终止。否则,它将继续并尝试访问不存在的第400项。我们会得到一个例外。
myarray?.get(400)