Chciałbym filtrować mój zestaw danych na dwóch warunkach jednocześnie.Filtr Scala w dwóch warunkach
Czy to możliwe?
chcę coś takiego:
mystuff = mystuff.filter(_.isX && _.name == "xyz")
Chciałbym filtrować mój zestaw danych na dwóch warunkach jednocześnie.Filtr Scala w dwóch warunkach
Czy to możliwe?
chcę coś takiego:
mystuff = mystuff.filter(_.isX && _.name == "xyz")
Korzystanie nieco mniej zwięzłej składni lambda:
mystuff = mystuff.filter(x => (x.isX && x.name == "xyz"))
można znaleźć więcej szczegółów na temat Scala anonimowej funkcji składni here.
Chociaż nie może być jakiś wpływ na wydajność w zależności od tego, co „mystuff” to, zawsze można filtrować dwukrotnie
mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")
Powoduje to podwójną pętlę całej listy. – squixy
@squixy tylko FYI, nie ma. 'filter' tworzy nową projekcję (lub widok) kolekcji tak, że gdy element zostanie zapytany podczas iteracji (np.' map', 'fold', etc ...) funkcja' filter' zostanie zastosowana do zobacz, czy element został zwrócony – ThaDon
Jeśli trzeba często filtrować z kilkoma orzecznika, można określić sposób ich łączenia:
case class And[A](p1: A=>Boolean, p2: A=>Boolean) extends (A=>Boolean) {
def apply(a: A) = p1(a) && p2(a)
}
Oto jak go używać, aby zachować tylko nieparzyste numery większe niż 10:
scala> (0 until 20) filter And(_ > 10, _ % 2 == 1)
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19)
Łatwo jest napisać kombinatory Or
i Not
w ten sam sposób.
czy to eliminuje obciążenie związane z wydajnością? Chodzi mi o to, że w zapytaniu końcowym jest to wyrażone poprawnie? – zinking