Me gustaría filtrar mi conjunto de datos en dos condiciones a la vez.Filtro Scala en dos condiciones
¿Es posible?
Quiero algo como esto:
mystuff = mystuff.filter(_.isX && _.name == "xyz")
Me gustaría filtrar mi conjunto de datos en dos condiciones a la vez.Filtro Scala en dos condiciones
¿Es posible?
Quiero algo como esto:
mystuff = mystuff.filter(_.isX && _.name == "xyz")
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.
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")
Esto causa un doble bucle en toda la lista. – squixy
@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
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.
¿Esto elimina la sobrecarga de rendimiento? Quiero decir que al final la consulta se expresa correctamente? – zinking