Я хотел бы отфильтровать свой набор данных сразу по двум условиям.
Является ли это возможным?
Я хочу что-то вроде этого:
mystuff = mystuff.filter(_.isX && _.name == "xyz")
Я хотел бы отфильтровать свой набор данных сразу по двум условиям.
Является ли это возможным?
Я хочу что-то вроде этого:
mystuff = mystuff.filter(_.isX && _.name == "xyz")
Используя немного менее краткий синтаксис лямбда:
mystuff = mystuff.filter(x => (x.isX && x.name == "xyz"))
Вы можете найти более подробную информацию о синтаксисе анонимных функций Scala здесь .
Хотя может быть некоторое влияние на производительность в зависимости от того, что такое «myStuff», вы всегда можете отфильтровать дважды
mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")
filter
создает новую проекцию (или представление) коллекции таким образом, что когда элемент запрашивается во время итерации (т. е. map
, fold
и т. д.), применяются функции filter
, чтобы увидеть, возвращается ли элемент
- person ThaDon; 29.05.2016
Array
, List
, Vector
...) создаст промежуточную коллекцию
- person AlexFoxGill; 21.06.2018
Если вам нужно часто фильтровать несколько предикатов, вы можете определить способ их объединения:
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
.
mystuff.filter( each => each.isX && each.name.equals("xyz"))
?
- person ForeverLearner; 06.02.2020