50

一度に 2 つの条件でデータ セットをフィルター処理したいと考えています。

出来ますか?

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

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

3 に答える 3

80

少し簡潔でないラムダ構文を使用する:

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

Scala無名関数の構文の詳細については、こちらをご覧ください。

于 2012-06-20T20:25:56.733 に答える
10

「myStuff」の内容によってはパフォーマンスに影響が出る可能性がありますが、常に 2 回フィルタリングできます。

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")
于 2012-06-20T21:45:04.340 に答える
6

複数の述語で頻繁にフィルタリングする必要がある場合は、それらを組み合わせる方法を定義できます。

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

于 2012-06-20T21:56:03.580 に答える