2010-07-19 11 views
45

Qual è il modo migliore per rimuovere elementi Null da un elenco in Groovy?Rimuovi elementi nulli da un elenco in Groovy

es: [null, 30, null]

vogliono tornare: [30]

+1

divertente che nessuno ha chiesto come i null sono finiti nella lista in primo luogo. Sembra che tu stia affrontando il sintomo piuttosto che il problema. – Snekse

risposta

59

qui è una risposta se non volete mantenere la lista

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

    list.removeAll([null]) 

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

originale in un pratico test di unità da dandy

+1

+1 per la soluzione più leggibile (si legge come: "rimuovere tutti i null") –

44

Il metodo findAll dovrebbe fare quello che ti serve.

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

+1 per una soluzione che non modifica l'elenco originale –

+1

'[null, 30, null] .findAll {it}' farà. –

+4

Thomas, findAll {it} rimuoverà 0 e null.E se questo è ciò che vuoi allora potresti anche fare un findAll() –

102

Basta usare meno:

[null, 30, null] - null 
+0

Questo sembra semplice e ottimo, e mi ha aiutato –

+4

+1 The migliore risposta! –

+3

Si può anche usare [null, 30, null] .minus (null). Mi sembra più leggibile. La versione con '-' ricorda l'abuso dell'operatore di SBT. –

9

penso scoprirai che questo è il più breve, supponendo che non ti dispiaccia altri valori "falsi" anche scomparendo:

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

pubblico Collection findAll() trova gli elementi corrispondenti alla chiusura IDENTITÀ (cioè corrispondente alla verità di Groovy). Esempio:

articoli def = [1, 2, 0, falso, vero, '', 'foo', [], [4, 5], null] asserire items.findAll() == [1, 2, vera, 'pippo', [4, 5]]

2

Semplicemente [null].findAll{null != it} se it è null allora restituire false in modo da non esistere in nuova collezione.

+1

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

+0

Hai ragione, grazie. –

4

Questo può essere ottenuto anche da 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

Un altro modo per farlo è [null, 20, null].findResults{it}.

1

Ciò comporta la rimozione di tutti gli elementi nulli.

myList.removeAll { !it } 

Se il numero 0 è nel vostro dominio è possibile controllare contro nullo

myList.removeAll { it == null } 
Problemi correlati