Scala:将Set传递给集合的map函数意味着什么

时间:2012-02-07 17:57:38

标签: scala

我刚看到我能做到:

Set(1, 2, 3).map(Set(1))

产生结果:

Set(true, false)

但我认为map函数只能采用另一个函数而不是新的Set。如果有什么我希望这会返回一组集合。发生了什么,结果意味着什么?

3 个答案:

答案 0 :(得分:20)

  

但我认为map函数只能使用另一个函数而不是新的Set

Set 一个功能。它是从元素到布尔值的函数:当你传递一个元素时,它会告诉你该元素是否是Set的一部分。

Set(1, 2, 3).map(Set(1))

迭代Set(1, 2, 3),将每个元素传递给Set(1)。即它首先要求“1成为{1}的成员true”,然后它会询问23的相同问题,即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))