2011-01-29 26 views
22

Deje el código hablar primeroObtener el primer elemento de una lista idiomáticamente en maravilloso

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

¿Hay una manera más elegante o idiomática para obtener el primer elemento de una lista, o null si no es posible? (No consideraría un bloque try-catch elegante aquí.)

+0

¿Qué devuelve #listBars? Groovy no debería tirar si intentas obtener un elemento que no existe en una lista. 'l final = []' ' afirmar l [0] == null' ' afirmar l.getAt (0) == null' 'afirmar l instanceof ArrayList' –

Respuesta

45

No estoy seguro de que el uso de find sea más elegante o idiomático, pero es conciso y no lanzará una excepción IndexOutOfBoundsException.

def foo 

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

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

foo = null 
assert null == foo?.find { true } 
+4

1 para este truco. Podría hacerlo aún más conciso: 'foo? .find {it}' –

+3

Adam, [0] .find {it} devuelve nulo – tixxit

+2

Esto haría un gran método de conveniencia además de los mapas de Groovy como "first()" –

11

También puede hacer

foo[0] 

Esto lanzará una NullPointerException cuando foo es nula, pero va a devolver un valor nulo en una lista vacía, a diferencia de foo.first() que lanzar una excepción en vacío.

+0

¡gracias por compartir! Me estaba quedando atascado en una solución idiomática para el primer elemento después de encontrar todo en una lista que podría estar vacía en primer lugar, o después de FindAll y esto me dio lo que necesitaba –

0

Desde Groovy 1.8.1 podemos usar los métodos tomar() y soltar(). Con el método take() obtenemos elementos del principio de la lista. Pasamos la cantidad de elementos que queremos como argumento para el método.

Para eliminar elementos del comienzo de la Lista, podemos utilizar el método drop(). Pase la cantidad de elementos para soltar como argumento del método.

Tenga en cuenta que la lista original no ha cambiado, el resultado del método take()/drop() es una nueva lista.

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] 
Cuestiones relacionadas