为什么 Scala 没有 withFilterNot?
Why does Scala not have withFilterNot?
在像 Seq
这样的 Scala 集合中,我们有方法 filter
,为了方便起见,还有 filterNot
。后者允许我们编写例如
seq.filterNot(someSet.contains)
而不是不太优雅的
seq.filter(e => !someSet.contains(e))
除了这些方法之外,我们还有 WithFilter
class 可以懒惰地评估过滤条件。方便的是,用法与 filter
:
相同
seq.withFilter(e => !someSet.contains(e))
我的问题是:为什么我们没有这样的 withFilterNot
:
seq.withFilterNot(someSet.contains)
更具体地说:它只是 Scala 开发人员认为 unnecessary/low 优先考虑的功能,还是有技术原因?
你可以写得更短: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)
等
在像 Seq
这样的 Scala 集合中,我们有方法 filter
,为了方便起见,还有 filterNot
。后者允许我们编写例如
seq.filterNot(someSet.contains)
而不是不太优雅的
seq.filter(e => !someSet.contains(e))
除了这些方法之外,我们还有 WithFilter
class 可以懒惰地评估过滤条件。方便的是,用法与 filter
:
seq.withFilter(e => !someSet.contains(e))
我的问题是:为什么我们没有这样的 withFilterNot
:
seq.withFilterNot(someSet.contains)
更具体地说:它只是 Scala 开发人员认为 unnecessary/low 优先考虑的功能,还是有技术原因?
你可以写得更短: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)
等