Scala过滤器有两种情况

ric*_*oni 43 arrays scala filter multiple-conditions

我想一次过滤两个条件下的数据集.

可能吗?

我想要这样的东西:

mystuff = mystuff.filter(_.isX && _.name == "xyz")
Run Code Online (Sandbox Code Playgroud)

Ale*_*son 69

使用稍微简洁的lambda语法:

mystuff = mystuff.filter(x => (x.isX && x.name == "xyz"))
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关Scala匿名函数语法的更多详细信息.


Dav*_*ith 9

虽然根据"myStuff"的内容可能会有一些性能影响,但您总是可以过滤两次

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz")
Run Code Online (Sandbox Code Playgroud)

  • @squixy只是一个FYI,它没有.`filter`创建一个集合的新投影(或视图),这样当迭代期间要求一个元素(即`map`,`fold`等......)时,`filter`函数被应用于看看元素是否被返回 (5认同)
  • 这会导致整个列表的双重循环。 (2认同)

par*_*tic 6

如果您需要经常使用多个谓词进行过滤,则可以定义一种组合它们的方法:

case class And[A]( p1: A=>Boolean, p2: A=>Boolean ) extends (A=>Boolean) {
  def apply( a: A ) = p1(a) && p2(a)
}
Run Code Online (Sandbox Code Playgroud)

以下是如何使用它来仅保留大于10的奇数:

scala> (0 until 20) filter And( _ > 10, _ % 2 == 1 )
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19)
Run Code Online (Sandbox Code Playgroud)

它以同样的方式易于编写OrNot组合.