Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Scala:迭代器与列表上过滤器的行为_List_Scala_Filter_Iterator - Fatal编程技术网

List Scala:迭代器与列表上过滤器的行为

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

//考虑到过滤器的定义,我希望下面的表达式(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)更好?为什么

//我试过清单上的同样东西,我希望它能起作用

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