web-dev-qa-db-ja.com

Scala 2つの条件でフィルター

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

出来ますか?

私はこのようなものが欲しい:

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

わずかに簡潔なラムダ構文を使用します。

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

詳細については、Scala無名関数構文 here を参照してください。

67
Alex Wilson

「myStuff」が何であるかに応じて、パフォーマンスに多少の影響があるかもしれませんが、常に2回フィルタリングできます

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")
9
Dave Griffith

いくつかの述語で頻繁にフィルタリングする必要がある場合、それらを結合する方法を定義できます。

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コンビネータを同じ方法で簡単に書くことができます。

6
paradigmatic