2012-06-20 23 views
36

データセットを2つの条件で同時にフィルタリングしたいと思います。2つの条件でのスカラフィルタ

可能ですか?

私はこのような何かしたい:あなたはScalaの匿名関数の構文hereで詳細を見つけることができ

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

:わずかに少ない簡潔なラムダ構文を使用して

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

答えて

58

を。

+1

これにより、パフォーマンスのオーバーヘッドがなくなりますか?私は最後のクエリでこれは正しく表現されているのですか? – zinking

4

「のMyStuff」は何であるかに応じて、いくつかのパフォーマンスへの影響があるかもしれませんが、あなたは常にあなたが頻繁にいくつかの述語でフィルタリングする必要がある場合は、あなたがそれらを組み合わせる方法を定義することができます二回

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

これは、リスト全体を二重ループさせます。 – squixy

+5

@squixyただのFYI、そうではありません。 'filter'は、繰り返しの間に要素が要求されたとき(すなわち' map'、 'fold'など)、' filter'関数が要素が返されたかどうかを確認する – ThaDon

4

フィルタリングできます。ここで

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) 

同じ方法でOrNotのコンビネータを書くのは簡単です。

関連する問題