Groovy 3 adds the feature of safe index based access for lists, arrays and maps. This means we can use ?[index]
to get or a set a value on a list or array without getting a NullPointerException
when the list or array is not initialised. With maps we can use ?[key]
for getting a value or set a value and when the map object is not initialised we don't get a NullPointerException
.
In the following example we see several examples of setting or getting values using indices or keys:
def list = null // Accessing null list or array // using index based access, // will throw NullPointerException when // collection is null. try { list[0] } catch (NullPointerException npe) { assert npe } // Using ?[...] will not throw NullPointerException. assert list?[0] == null // Assignment are ignored when list is null. list?[1] = 42 assert list?[1] == null // When collection is not null we simply // get the default behaviour for index based // access of elements. def values = ["Groovy", "rocks"] assert values?[0] == "Groovy" values?[2] = '!' assert values?.join(" ") == "Groovy rocks !" // We can use ?[key] for maps as well. def info = null assert info?['address'] == null info?['address'] = 'unknown' assert info?['address'] == null def user = [alias: 'mrhaki', loves: 'Groovy'] assert user?['alias'] == 'mrhaki' user?['country'] = 'The Netherlands' assert user?['country'] == 'The Netherlands' assert user?['age'] == null
Written with Groovy 3.0.1.