List Scala:迭代器与列表上过滤器的行为
//考虑到过滤器的定义,我希望下面的表达式(1)能够工作: //问题#1:下面的表达式(2)是如何工作的?它从哪里得到List Scala:迭代器与列表上过滤器的行为,list,scala,filter,iterator,List,Scala,Filter,Iterator,//考虑到过滤器的定义,我希望下面的表达式(1)能够工作: //问题#1:下面的表达式(2)是如何工作的?它从哪里得到A=>Boolean推断?我想问,布尔值是从哪里来的 scala> Iterator(2,4,6).filter(Set(1,2,3).contains).toSet res1: scala.collection.immutable.Set[Int] = Set(2) //问题#2:哪一种表达方式(1)比(2)更好?为什么 //我试过清单上的同样东西,我希望它能起作用 s
A=>Boolean
推断?我想问,布尔值是从哪里来的
scala> Iterator(2,4,6).filter(Set(1,2,3).contains).toSet
res1: scala.collection.immutable.Set[Int] = Set(2)
//问题#2:哪一种表达方式(1)比(2)更好?为什么
//我试过清单上的同样东西,我希望它能起作用
scala> Iterator(2,4,6).filter(Set(1,2,3)).toSet
res2: scala.collection.immutable.Set[Int] = Set(2)
//问题#3:当它神奇地为迭代器工作时,为什么不工作
scala> List(2,4,6).filter(List(1,2,3).contains)
res3: List[Int] = List(2)
scala>List(2,4,6).过滤器(List(1,2,3))
:8:错误:类型不匹配;
发现:Int(1)
必填项:布尔值
列表(2,4,6).过滤器(列表(1,2,3))
回答#1
filter(Set(1,2,3))
工作的原因是Set
具有阴影包含的apply
方法:
scala> List(2,4,6).filter(List(1,2,3))
<console>:8: error: type mismatch;
found : Int(1)
required: Boolean
List(2,4,6).filter(List(1,2,3))
回答#2
它们是相同的
回答#3
这也是为什么List(2,4,6).filter(List(1,2,3))
不起作用的原因。如果您尝试使用List(2,4,6).filter(Set(1,2,3))
,它会工作。列表的apply是列表中某个位置的访问器:
class Set[T] {
def apply(elem: T): Boolean
}
问题#1:下面的表达式(2)是如何工作的?它从哪里得到A=>布尔推理?我想问,布尔值是从哪里来的
scala> Iterator(2,4,6).filter(Set(1,2,3).contains).toSet
res1: scala.collection.immutable.Set[Int] = Set(2)
Set[A]扩展了(A)=>Boolean
,因此Set(1,2,3)
是一个函数A=>Boolean
。我们很容易看到,因为它有一个apply方法,用于测试集中是否包含元素
class List[T] {
def apply(n: Int): Int
}
问题2:哪一种表达方式(1)比(2)更好?为什么?我试过清单上的同样东西,我希望它能起作用
scala> Iterator(2,4,6).filter(Set(1,2,3)).toSet
res2: scala.collection.immutable.Set[Int] = Set(2)
哪一个更好更多的是一个意见的问题——在功能上它们完全相同。对于那些熟悉Set
的人来说,应该清楚这两者的作用(它们都相当于包含)。有人可能会说,使用Set(1,2,3)。contains
可以更清楚地了解它的功能。列表
具有应用方法,但与集合
不同<代码>列表#应用
是Int=>A
——一种按索引从列表
中检索元素的方法。因此,对于列表,必须使用contains
问题#3:当它神奇地为迭代器工作时,为什么不工作
scala> List(2,4,6).filter(List(1,2,3).contains)
res3: List[Int] = List(2)
这实际上与#2相同<代码>列表(1,2,3)。应用
不是Int=>Boolean
,而是Int=>Int