2010-07-19 11 views
45

¿Cuál es la mejor manera de eliminar elementos nulos de una lista en Groovy?Eliminar elementos nulos de una lista en Groovy

ejemplo: [null, 30, null]

quieren volver: [30]

+1

Es curioso que nadie Preguntó cómo los nulos terminaron en la lista en primer lugar. Parece que podría estar abordando el síntoma en lugar del problema. – Snekse

Respuesta

59

aquí es una respuesta si usted no desea mantener la lista original

void testRemove() { 
    def list = [null, 30, null] 

    list.removeAll([null]) 

    assertEquals 1, list.size() 
    assertEquals 30, list.get(0) 
} 

en una unidad de prueba excelente práctico

+1

+1 para la solución más legible (lee como: "eliminar todos los nulos") –

44

El método findAll debe hacer lo que necesita.

​[null, 30, null]​.findAll {it != null}​ 
+7

+1 para una solución que no cambie la lista original –

+1

'[null, 30, null] .findAll {it}' hará. –

+4

Thomas, findAll {it} eliminará 0 y null.Y si eso es lo que desea, entonces también puede hacer un findAll() –

102

sólo tiene que utilizar menos:

[null, 30, null] - null 
+0

Esto se ve simple y genial, y me ayudó –

+4

+1 The ¡la mejor respuesta! –

+3

También se puede usar [nulo, 30, nulo] .minus (nulo). Eso me parece más legible. La versión con '-' recuerda el abuso del operador SBT. –

9

pienso encontrará que este es el más corto, suponiendo que no le molesten otros valores "falsos" que también desaparecen:

println([null, 30, null].findAll()) 

pública Colección findAll() encuentra los elementos que coincidan con el Cierre IDENTIDAD (es decir, haciendo juego Groovy verdad). Ejemplo:

def items = [1, 2, 0, falso, verdadero, '', 'foo', [], [4, 5], nulo] assert items.findAll() == [1, 2, es cierto, 'foo', [4, 5]]

2

Simplemente [null].findAll{null != it} si it es nulo entonces de regreso falsa por lo que no existirá en nueva colección.

+1

'assertEquals [], [0, false, null] .findAll {it}' –

+0

Tienes razón, gracias. –

4

Esto también se puede lograr mediante grep:

assert [null, 30, null].grep()​ == [30]​ 

o

assert [null, 30, null].grep {it}​ == [30]​ 

o

assert [null, 30, null].grep { it != null } == [30]​ 
1

Otra manera de hacerlo es [null, 20, null].findResults{it}.

1

Esto hace una eliminación in situ de todos los elementos nulos.

myList.removeAll { !it } 

Si el número 0 está en su dominio se puede comprobar en contra nula

myList.removeAll { it == null } 
Cuestiones relacionadas