2012-01-10 5 views
13

¿Existe una forma maravillosa de eliminar un elemento de la colección mientras se itera? En Java esto se logra utilizando Iterator.remove():Groovy remove Artículo de la colección al iterar

Collection collection = ... 
for (Iterator it=collection.iterator(); it.hasNext();) { 
    Object obj = it.next(); 
    if (should remove) { 
     it.remove(); 
    } 
} 

¿El maravilloso proporcionar quitar mientras está iterando en su sintaxis del lenguaje, o tengo que hacer Usa Iterator.remove()?

Respuesta

23

Use removeAll().

> c = [1, 2, 3, 4, 5] 
> c.removeAll { it % 2 == 0 } 
> println c 
[1, 3, 5] 

Usted pregunta específicamente sobre "al iterar", ¿está tratando de hacer algo con/también cada objeto? removeAll todavía funciona siempre y cuando la última declaración de cierre sigue siendo Truthy/Falsey- (como antes):

> c.removeAll { 
*  tmp = it * 10 
*  println "ohai ${it}*10=${tmp}" 
*  tmp >= 40 
* } 
ohai 1*10=10 
ohai 2*20=20 
ohai 3*30=30 
ohai 4*40=40 
ohai 5*50=50 
> println c 
[1, 2, 3] 

valor de retorno del cierre (valor de la última declaración, o un valor explícito return) es Truthy/Falsey-, se se usará para determinar qué se debe eliminar. No es necesario hacer referencia explícita a cada objeto.

+2

Muy bueno! No sabía acerca de .removeAll {} –

+1

@JarredOlson. Si es nuevo en Groovy, le sugiero que se abstenga de realizar bucles manuales basados ​​en iteradores (o 'para ()' para bucles). Con métodos basados ​​en el cierre como 'each',' collect', 'findAll', etc. Nunca he tenido la necesidad de usar iteradores explícitos en Groovy, y eso ha sido un gran alivio = D – epidemian

+0

@epidemian No soy nuevo, simplemente no sabía acerca de .removeAll {} y simplemente pensé que era genial :) Sin embargo, me haría eco de sus afirmaciones en el sentido de que usar los métodos de Collection es una muy buena manera de familiarizarse con los cierres/Groovy. –

Cuestiones relacionadas