Filtre Scala à deux conditions

Je voudrais filtrer mon dataset à deux conditions à la fois.

C’est possible?

Je veux quelque chose comme ça:

mystuff = mystuff.filter(_.isX && _.name == "xyz") 

En utilisant une syntaxe lambda légèrement moins concise:

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

Vous trouverez plus de détails sur la syntaxe de la fonction anonyme Scala ici .

Bien qu’il puisse y avoir un impact sur les performances en fonction de “myStuff”, vous pouvez toujours filtrer deux fois

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

Si vous devez fréquemment filtrer avec plusieurs prédicats, vous pouvez définir un moyen de les combiner:

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

Voici comment l’utiliser pour ne garder que les nombres impairs supérieurs à 10:

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

Il est facile d’écrire des combinateurs Or et Not de la même manière.