groovy
Оператор распространения
Поиск…
замечания
В большинстве случаев оператор спред *.
идентичен вызову .collect { it.________ }
.
def animals = ['cat', 'dog', 'fish']
assert animals*.length() == animals.collect { it.length() }
Но если объект имеет значение null, он ведет себя иначе:
def animals = null
assert animals*.length() == null
assert animals.collect { it.length() } == []
Вызов метода
assert ['cat', 'dog', 'fish']*.length() == [3, 3, 4]
Обратите внимание, что при смешивании типов в коллекции, если метод не существует на некоторых элементах, может быть groovy.lang.MissingMethodException
:
['cat', 'dog', 'fish',3]*.length()
// it throws groovy.lang.MissingMethodException: No signature of method: java.lang.Integer.length()
Доступ к собственности
class Vector {
double x
double y
}
def points = [
new Vector(x: 10, y: -5),
new Vector(x: -17.5, y: 3),
new Vector(x: -3.3, y: -1)
]
assert points*.x == [10, -17.5, -3.3]
Примечание: *
необязательно. Мы могли бы также написать вышеприведенный оператор, как в приведенной ниже строке, и компилятор Groovy все равно будет рад этому.
assert points.x == [10, -17.5, -3.3]
Его нуль-сейф
Если в коллекции есть null
объект, он не выбрасывает NPE
, вместо этого он возвращает null
:
assert ['cat', 'dog', 'fish', null]*.length() == [3, 3, 4, null]
Используя его непосредственно в null
объекте, он также является нулевым:
def nullCollection = null
assert nullCollection*.length() == null
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow