【问题标题】:How does flatMap work on Maps in scala? map can be used as mapValues on Maps but how does the flatMap function work on Map objects?flatMap 如何在 scala 中的地图上工作? map 可以用作 Maps 上的 mapValues 但 flatMap 函数如何在 Map 对象上工作?
【发布时间】:2017-10-19 10:30:56
【问题描述】:

我无法理解地图对象上 flatMap 函数的功能。

【问题讨论】:

标签: scala dictionary flatmap


【解决方案1】:

如果你想从地图函数中展平你的结果,你可以使用 flatMap。 请记住:

flatMap(something)

等同于

map(something).flatten

【讨论】:

    【解决方案2】:

    如果你在 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 的任何其他方式。

    【讨论】:

      【解决方案3】:

      我认为这是个好问题,因为地图不能像其他集合一样展平。首先我们应该看看这个方法的签名:

      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,它可以是一些 MapSeq 甚至是Option,它将被映射扁平化。您也可以提供自己的 CanBuildFrom

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 2017-02-23
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        相关资源
        最近更新 更多