为什么Scala没有withFilterNot?

时间:2018-11-17 10:14:53

标签: scala collections scala-collections

Seq之类的Scala集合中,我们有方法filter,为方便起见,我们有filterNot方法。后者使我们可以编写例如

seq.filterNot(someSet.contains)

而不是不太优雅

seq.filter(e => !someSet.contains(e))

除了这些方法之外,我们还有WithFilter类,可以延迟评估过滤条件。方便地,用法与filter相同:

seq.withFilter(e => !someSet.contains(e))

我的问题是:为什么我们没有这样的withFilterNot

seq.withFilterNot(someSet.contains)

更具体地说:仅仅是Scala开发人员认为它是不必要/低优先级的功能,还是有技术原因?

1 个答案:

答案 0 :(得分:1)

您可以写得更短:seq.filterNot(someSet)

对于.withFilterNot,如果您认为拥有以下内容很重要,则可以轻松地自己添加:

object PimpSyntax {
   implicit class PimpedSeq[T](val seq: Seq[T]) extends AnyVal {
      def withFilterNot(filter: T => Boolean) = seq.withFilter(!f(_))
   }
}

现在,只需import PimpSyntax._,您就可以随便写seq.withFilterNot(someSet)之类的东西。

或者,甚至更好:

 object PimpSyntax {
     implicit class Negator[T](val f: T => Boolean) extends AnyVal {
        def unary_!: T => Boolean = !f(_)
     }
 }

使用此功能,您不仅可以执行seq.withFilter(!someSet),而且还可以执行seq.partition(!someSet)seq.find(!someSet)seq.dropWhile(!someSet)等操作。