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

Chu*_*ucK 14 scala

我刚看到我能做到:

Set(1, 2, 3).map(Set(1))
Run Code Online (Sandbox Code Playgroud)

产生结果:

Set(true, false)
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 20

但我认为该map功能只能采取另一种新功能Set.

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

Set(1, 2, 3).map(Set(1))
Run Code Online (Sandbox Code Playgroud)

迭代Set(1, 2, 3),将每个元素传递给Set(1).即,其第一次询问"是1组的成员{1}",这是true,则它要求同样的问题23,这是false.

所以,结果是Set(true, false, false),当然这只是Set(true, false).

类似地,序列是从整数到元素的函数,映射是从键到值的函数.


ten*_*shi 5

Set也是功能 - 它延伸Function1.请参阅Scaladoc中的Inherited部分:

http://www.scala-lang.org/api/current/scala/collection/immutable/Set.html


mis*_*tor 5

  • Set[A]延伸Function1[A, Boolean].
  • Map[K, V]延伸 PartialFunction[K, V],反过来延伸Function1[K, V].
  • Seq[A]延伸PartialFunction[Int, A],反过来延伸 Function1[Int, A].

因此,在Scala集合库中,集合,序列和映射本身就是函数.

  • applySet[_]测试方法设置成员资格.
  • applymethod in Map[_, _] 返回与给定键关联的值.如果密钥不存在则引发错误.
  • apply方法in Seq[_]返回给定索引处的元素.引发无效索引的错误.

以下两个是等效的:

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

Set(1, 2, 3).map(x => Set(1).contains(x))
Run Code Online (Sandbox Code Playgroud)

以下两个是:

Seq(1, 2, 3).collect(someMap)

Seq(1, 2, 3) collect { 
  case x if someMap contains x => someMap(x)
}
Run Code Online (Sandbox Code Playgroud)

还有以下两个:

Seq(1, 2, 3).map(someSeq)

Seq(1, 2, 3).map(x => someSeq(x))
Run Code Online (Sandbox Code Playgroud)