【发布时间】:2017-10-19 10:30:56
【问题描述】:
我无法理解地图对象上 flatMap 函数的功能。
【问题讨论】:
-
有什么具体的例子让你心碎并乐于分享??
-
伙计们,不要在没有解释的情况下投反对票。
标签: scala dictionary flatmap
我无法理解地图对象上 flatMap 函数的功能。
【问题讨论】:
标签: scala dictionary flatmap
如果你想从地图函数中展平你的结果,你可以使用 flatMap。 请记住:
flatMap(something)
等同于
map(something).flatten
【讨论】:
如果你在 Map 中有一个值或一个键有一个列表,那么它可以是 flatMap-ed。
例子:
val a = Map(1->List(1,2),2->List(2,3))
a.map(_._2) 给List(List(1,2),List(2,3))
您可以使用 flatMap 将其展平 => a.flatMap(_._2) 或 a.map(_._2).flatten 给出 List(1,2,2,3)
源代码:http://www.scala-lang.org/old/node/12158.html
不确定在地图上使用 flatMap 的任何其他方式。
【讨论】:
我认为这是个好问题,因为地图不能像其他集合一样展平。首先我们应该看看这个方法的签名:
def flatMap[B](f: (A) ⇒ GenTraversableOnce[B]): Map[B]
因此,文档说它应该返回 Map,但事实并非如此,因为它可以返回任何 GenTraversableOnce 而不仅仅是它。我们可以在提供的示例中看到它:
def getWords(lines: Seq[String]): Seq[String] = lines flatMap (line => line split "\\W+")
// lettersOf will return a Seq[Char] of likely repeated letters, instead of a Set
def lettersOf(words: Seq[String]) = words flatMap (word => word.toSet)
// lettersOf will return a Set[Char], not a Seq
def lettersOf(words: Seq[String]) = words.toSet flatMap (word => word.toSeq)
// xs will be an Iterable[Int]
val xs = Map("a" -> List(11,111), "b" -> List(22,222)).flatMap(_._2)
// ys will be a Map[Int, Int]
val ys = Map("a" -> List(1 -> 11,1 -> 111), "b" -> List(2 -> 22,2 -> 222)).flatMap(_._2)
让我们看看完整的签名:
def flatMap[B, That](f: ((K, V)) ⇒ GenTraversableOnce[B])(implicit bf: CanBuildFrom[Map[K, V], B, That]): That
现在我们看到它返回 That - 隐含的 CanBuildFrom 可以为我们提供的东西。
您可以找到许多关于 CanBuildFrom 工作原理的解释。 但主要的想法是把一些函数从你的 key -> value 对放到 GenTraversableOnce,它可以是一些 Map、Seq 甚至是Option,它将被映射和扁平化。您也可以提供自己的 CanBuildFrom。
【讨论】: