2012-06-20 25 views

Respuesta

58

Utilizando la sintaxis lambda poco menos concisa:

mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) 

Puede encontrar más detalles sobre el Scala sintaxis de la función anónima here.

+1

¿Esto elimina la sobrecarga de rendimiento? Quiero decir que al final la consulta se expresa correctamente? – zinking

4

Si bien puede haber algún impacto en el rendimiento dependiendo de lo que es "mystuff", siempre se puede filtrar dos veces

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz") 
+0

Esto causa un doble bucle en toda la lista. – squixy

+5

@squixy solo un FYI, no es así. 'filter' crea una nueva proyección (o vista) de la colección de manera que cuando se solicita un elemento durante la iteración (es decir,' map', 'fold', etc ...) las funciones' filter' se aplican a ver si el elemento es devuelto – ThaDon

4

Si necesita filtrar con frecuencia con varios predicado, se podría definir una forma de combinarlos:

case class And[A](p1: A=>Boolean, p2: A=>Boolean) extends (A=>Boolean) { 
    def apply(a: A) = p1(a) && p2(a) 
} 

Aquí es cómo usarlo para mantener sólo los números impares mayores de 10:

scala> (0 until 20) filter And(_ > 10, _ % 2 == 1) 
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) 

Es fácil escribir Or y Not combinadores de la misma manera.

Cuestiones relacionadas