Получить первый элемент списка идиоматически в Groovy

Пусть говорят первый код

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

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

3 ответов


Не уверен, что использование 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 }

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

foo[0]

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


начиная с 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]