我刚看到我能做到:
Set(1, 2, 3).map(Set(1))
产生结果:
Set(true, false)
但我认为map函数只能采用另一个函数而不是新的Set。如果有什么我希望这会返回一组集合。发生了什么,结果意味着什么?
答案 0 :(得分:20)
但我认为
map
函数只能使用另一个函数而不是新的Set
。
Set
是一个功能。它是从元素到布尔值的函数:当你传递一个元素时,它会告诉你该元素是否是Set
的一部分。
Set(1, 2, 3).map(Set(1))
迭代Set(1, 2, 3)
,将每个元素传递给Set(1)
。即它首先要求“1
成为{1}
的成员true
”,然后它会询问2
和3
的相同问题,即false
Set(true, false, false)
。
因此,结果为Set(true, false)
,当然只有{{1}}。
类似地,序列是从整数到元素的函数,映射是从键到值的函数。
答案 1 :(得分:5)
Set
也是函数 - 它扩展了Function1
。请参阅Scaladoc中的继承部分:
http://www.scala-lang.org/api/current/scala/collection/immutable/Set.html
答案 2 :(得分:5)
Set[A]
延伸Function1[A, Boolean]
。 Map[K, V]
延伸
PartialFunction[K, V]
反过来延伸Function1[K, V]
。Seq[A]
延伸PartialFunction[Int, A]
,后者又延伸
Function1[Int, A]
。因此,在Scala集合库中,集合,序列和映射本身就是函数。
apply
测试中的Set[_]
方法设置了成员资格。 apply
中的Map[_, _]
方法
返回与给定键关联的值。如果出现错误则引发错误
密钥缺席。apply
中的Seq[_]
方法返回给定索引处的元素。引发无效索引的错误。以下两个是等效的:
Set(1, 2, 3).map(Set(1))
Set(1, 2, 3).map(x => Set(1).contains(x))
以下两个是:
Seq(1, 2, 3).collect(someMap)
Seq(1, 2, 3) collect {
case x if someMap contains x => someMap(x)
}
还有以下两个:
Seq(1, 2, 3).map(someSeq)
Seq(1, 2, 3).map(x => someSeq(x))