【问题标题】:flatMap within recursive function to return a List of case class objects递归函数中的 flatMap 返回案例类对象列表
【发布时间】:2018-07-25 17:58:56
【问题描述】:

我有一个重度嵌套的Map[String, Any](来自解析的 JSON)。我的意图是通过递归映射并从映射键+值填充对象,将这个(展平这个)转换为案例类对象列表。我在递归函数中使用flatMap,但遇到编译问题:

<console>:30: error: type mismatch;  found   : scala.collection.immutable.Iterable[Derived]  required: List[Derived]
         map.flatMap {
                     ^

我的代码如下所示。请指出我做错了什么以及如何解决?

case class Derived(a: String, b: String, c: String)
val Sep = "/"
def getDerivedList(map: Map[String, Any], prefix: String = Sep) : List[Derived] = {
  map.flatMap {
    //Handle Map as value by recursing
    case (k, v:Map[String, Any]) => getDerivedList(v, s"${prefix}${k}${Sep}")
    //Handle primitive type
    case (k, v) if (v != null && v != None) => {
      val value = if(v.isInstanceOf[Boolean]) String.valueOf(v).toUpperCase else String.valueOf(v)
      val a = "" //Custom logic from k or v
      val b = "" //Another custom logic from k or v
      val c = "" //You get it
      List(Derived(a,b,c))
    }
    case _ => List() //Catch all, will not come here as per my data
  }
}

val map: Map[String, Any] = Map("k1" -> "v1", "mk1" -> Map("mk1k2" -> "mk1v2", "mk1k3" -> Map("mk2k4" -> true)))
getDerivedList(map)

【问题讨论】:

    标签: scala flatmap


    【解决方案1】:

    Map 转换为List 可以通过Map 的方法.toList 轻松完成,该方法将映射转换为(键、值)元组列表。一旦你有了一个 List,你就可以用一个返回 List 的函数来对它进行平面映射。

    但是,如果您使用这样的函数(即返回 List 的函数)对 Map 进行平面映射,编译器将推断 List 和 Map 的最接近的公共超类型,即 Iterable。这就是你的情况。

    所以,只需更改为

    map.toList.flatMap {
    

    应该可以解决问题。

    【讨论】:

    • 是的。那行得通。你能解释一下 map.toList.flatMap 和 map.flatMap 之间的区别吗?
    • @sujit 当然,请参阅编辑!此外,您可能会考虑阅读一些关于 Scala 的材料,这些材料很好地解释了这些基础知识。还有一些不错的 Coursera 课程。
    • @sujit 另外,请考虑您是否真的特别想要List;这将取决于您将如何处理它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多