2012-06-20 16 views

Odpowiedz

58

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.

+1

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

4

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") 
+0

Powoduje to podwójną pętlę całej listy. – squixy

+5

@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

4

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.

Powiązane problemy