我正在使用收藏品,发现这有点奇怪:
val a = Seq(1, 2, 3, 4, 5, 6)
a.filterNot(Seq(1, 2, 3))
//=> expected output: List(4, 5, 6)
//=> actual: compiler error
<console>:13: error: type mismatch;
found : Int(3)
required: Boolean
a.filterNot(List(1, 2, 3))
但是,这个版本有效:
val a = Seq(1, 2, 3, 4, 5, 6)
a.filterNot(Set(1, 2, 3))
//=> expected output: List(4, 5, 6)
//=> actual: List(4, 5, 6)
我想知道为什么会这样。我读了Seq和Set定义,但发现了任何线索。
答案 0 :(得分:3)
一个容易被忽视的事实是Set[A]
延伸A => Boolean
。换句话说,Set
是谓词(检查成员身份的谓词)。这就是您可以将Set
传递给filterNot
。
答案 1 :(得分:1)
区别在于apply()
和Seq
个集合的Set
方法。查看filterNot()
:
def filterNot(p: (A) ⇒ Boolean): Seq[A]
它需要一个函数,当输入一个元素时,返回一个布尔值。 Set
这样做。 Seq
没有。
Set(2,3,6).apply(0) //res0: Boolean = false
Seq(2,3,6).apply(0) //res1: Int = 2
因此,当您调用a.filterNot(Set(1, 2, 3))
时,传递给Set
的{{1}}将应用于Seq filterNot
中的每个元素,这将导致a
{1}}或true
,这是false
所需要的。