Scala Seq的filterNot实现不接受另一个列表作为函数输入参数

Scala Seq的filterNot实现不接受另一个列表作为函数输入参数,scala,Scala,我正在处理收藏,发现这有点奇怪: 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

我正在处理收藏,发现这有点奇怪:

  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))

我想知道为什么会这样。我阅读了Seq和Set的定义,但找到了任何线索。

一个容易被忽视的事实是a扩展了a=>Boolean。换句话说,集合是检查成员资格的谓词。这就是为什么可以将集合传递给filterNot。

一个容易被忽略的事实是,a扩展了a=>Boolean。换句话说,集合是检查成员资格的谓词。这就是为什么可以将集合传递给filterNot。

区别在于Seq和Set集合的apply方法。请看filterNot的定义:

它接受一个函数,当输入一个元素时,该函数返回一个布尔值。Set就是这么做的。Seq没有

Set(2,3,6).apply(0)  //res0: Boolean = false
Seq(2,3,6).apply(0)  //res1: Int = 2
因此,当您调用a.filterNotSet1、2、3时,传递给filterNot的集合将应用于Seq、a中的每个元素,这将导致true或false,这是filterNot所需要的。

区别在于Seq和Set集合的apply方法。请看filterNot的定义:

它接受一个函数,当输入一个元素时,该函数返回一个布尔值。Set就是这么做的。Seq没有

Set(2,3,6).apply(0)  //res0: Boolean = false
Seq(2,3,6).apply(0)  //res1: Int = 2
因此,当调用a.filterNotSet1、2、3时,传递给filterNot的集合将应用于Seq、a中的每个元素,这将导致true或false,这是filterNot所需要的

Set(2,3,6).apply(0)  //res0: Boolean = false
Seq(2,3,6).apply(0)  //res1: Int = 2