Получить первый элемент списка идиоматически в Groovy - PullRequest
29 голосов
/ 30 января 2011

Пусть код говорит первым

def bars = foo.listBars()
def firstBar = bars ? bars.first() : null
def firstBarBetter = foo.listBars()?.getAt(0)

Есть ли более элегантный или идиоматический способ получить первый элемент списка или ноль, если это невозможно?(Я бы не считал блок try-catch элегантным.)

Ответы [ 3 ]

55 голосов
/ 30 января 2011

Не уверен, что использование find наиболее изящно или идиоматично, но оно сжато и не вызовет исключение IndexOutOfBoundsException.

def foo 

foo = ['bar', 'baz']
assert "bar" == foo?.find { true }

foo = []
assert null == foo?.find { true }

foo = null
assert null == foo?.find { true }
15 голосов
/ 10 июня 2013

Вы также можете сделать

foo[0]

Это вызовет исключение NullPointerException, когда foo равно null, но в пустом списке оно вернет нулевое значение, в отличие от foo.first(), которое выдаст исключение для пустого.

2 голосов
/ 22 февраля 2018

Начиная с Groovy 1.8.1, мы можем использовать методы take () и drop () . С помощью метода take () мы получаем элементы из начала списка . Мы передаем количество элементов, которые мы хотим, в качестве аргумента метода.

Чтобы удалить элементы из начала списка, мы можем использовать метод drop () . Передайте количество элементов, которые нужно отбросить, в качестве аргумента метода.

Обратите внимание, что исходный список не изменился , результатом метода take () / drop () является новый список.

def a = [1,2,3,4]

println(a.drop(2))
println(a.take(2))
println(a.take(0))
println(a)

*******************
Output:
[3, 4]
[1, 2]
[]
[1, 2, 3, 4]
...