在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开发人员认为它是不必要/低优先级的功能,还是有技术原因?
答案 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)
等操作。