Scala фильтр на двух условиях Я хотел бы сразу фильтровать свой набор данных в двух условиях. Возможно ли это? Мне нужно что-то вроде этого: mystuff = mystuff.filter(_.isX && _.name == "xyz") Ответ 1 Использование немного менее сжатого синтаксиса лямбда: mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) Подробнее о Scala анонимной синтаксисе функции здесь. Ответ 2 Если вам нужно часто фильтровать несколько предикатов, вы можете определить способ их объединения: case class And[A]( p1: A=>Boolean, p2: A=>Boolean ) extends (A=>Boolean) { def apply( a: A ) = p1(a) && p2(a) } Вот как использовать его, чтобы сохранить только нечетные числа больше 10: scala> (0 until 20) filter And( _ > 10, _ % 2 == 1 ) res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) Легко записывать комбинаторы Or и Not тем же способом. Ответ 3 Хотя в зависимости от того, что такое "myStuff", может быть какое-то влияние на производительность, вы всегда можете дважды фильтровать mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")
Ответ 1 Использование немного менее сжатого синтаксиса лямбда: mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) Подробнее о Scala анонимной синтаксисе функции здесь.
Ответ 2 Если вам нужно часто фильтровать несколько предикатов, вы можете определить способ их объединения: case class And[A]( p1: A=>Boolean, p2: A=>Boolean ) extends (A=>Boolean) { def apply( a: A ) = p1(a) && p2(a) } Вот как использовать его, чтобы сохранить только нечетные числа больше 10: scala> (0 until 20) filter And( _ > 10, _ % 2 == 1 ) res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) Легко записывать комбинаторы Or и Not тем же способом.
Ответ 3 Хотя в зависимости от того, что такое "myStuff", может быть какое-то влияние на производительность, вы всегда можете дважды фильтровать mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")