递归函数内的 flatMap 到 return 个案例 class 对象的列表
flatMap within recursive function to return a List of case class objects
我有一个嵌套很深的 Map[String, Any]
(来自已解析的 JSON)。我的目的是通过遍历 Map 并从 map 键+值填充对象,将其转换(展平)为 case class 对象列表。我在递归函数中使用 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)
将 Map
转换为 List
很容易通过 Map 的方法 .toList
完成,该方法将映射转换为(键,值)元组列表。一旦你有了一个列表,你就可以用一个 returns 列表的函数来平面化它。
但是,如果用这样的函数(即 returns 一个 List 的函数)平面映射一个 Map,编译器将推断出最接近的 List 和 Map 公共超类型,即 Iterable。这就是你的情况。
所以,只需更改为
map.toList.flatMap {
应该可以解决问题。
我有一个嵌套很深的 Map[String, Any]
(来自已解析的 JSON)。我的目的是通过遍历 Map 并从 map 键+值填充对象,将其转换(展平)为 case class 对象列表。我在递归函数中使用 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)
将 Map
转换为 List
很容易通过 Map 的方法 .toList
完成,该方法将映射转换为(键,值)元组列表。一旦你有了一个列表,你就可以用一个 returns 列表的函数来平面化它。
但是,如果用这样的函数(即 returns 一个 List 的函数)平面映射一个 Map,编译器将推断出最接近的 List 和 Map 公共超类型,即 Iterable。这就是你的情况。
所以,只需更改为
map.toList.flatMap {
应该可以解决问题。