Scala案例类递归

Scala案例类递归,scala,recursion,Scala,Recursion,我试图从一个分层的case类结构递归地创建一个键、值对映射,但没有成功 case class Country(id: Option[Long], name: String, states: Option[List[State]]) case class State(id: Option[Long], name: String, cities: Option[List[City]]) case class City(id: Option[Long], name: String) 所以我试着在列表

我试图从一个分层的case类结构递归地创建一个键、值对映射,但没有成功

case class Country(id: Option[Long], name: String, states: Option[List[State]])
case class State(id: Option[Long], name: String, cities: Option[List[City]])
case class City(id: Option[Long], name: String)
所以我试着在列表和zip中提取它以获得键值对,然后试着做一些递归计算以在对象列表中获得相同的结果

      val keys = country.getClass.getDeclaredFields.map(f => f.getName)
      val values = country.productIterator    
      val m = (keys zip values.toList).toMap
这给了我3个键及其值

我的问题是解决州内列表[城市]和国家内列表[州]的递归方式

有什么好办法吗?我想不出什么好的解决办法。我试着在地图上迭代,在有列表的地方进行匹配,然后迭代,并试着将这个过程保存在BufferList中

有人想做这样的事吗

编辑

我没有具体说明理想的产出

我想让孩子成为其他地图,所以从@Tienan Ren那里得到一个例子,我试着做如下事情:

def toMap[T: TypeTag](clazz: scala.Product): Map[String, Any] = {

    def recursion(key: String, list: List[T]): Map[String, Any] = {
      list.toMap
    }

    val keys = clazz.getClass.getDeclaredFields.map(_.getName)

    val values = (keys zip clazz.productIterator.toList) map {
      case (key, value: List[T]) => recursion(key, value)
      case (key, value) => (key, value)
    }

    values.toMap
  }

递归应该接收列表并返回映射。

不确定为什么要使用选项[list[…]],空列表应该能够表示无情况。下面是我删除列表选项后的实现

  case class Country(id: Option[Long], name: String, states: List[State])
  case class State(id: Option[Long], name: String, cities: List[City])
  case class City(id: Option[Long], name: String)
toMap函数:

 import reflect.runtime.universe._

 def toMap[T: TypeTag](c: scala.Product): Map[String, Any] = {

   val keys = c.getClass.getDeclaredFields.map(_.getName)

   val z = (keys zip c.productIterator.toList) map {
      case (key, value: List[T]) if typeOf[T] <:< typeOf[scala.Product] =>
        (key, value.map(v => toMap(v.asInstanceOf[scala.Product])))
      case (key, value) => (key, value)
   }

   z.toMap
}
这将为您提供:

Map(id -> None, name -> US, states -> List(Map(id -> None, name -> CA, cities -> List(Map(id -> None, name -> LA)))))

你想干什么?您能否提供一个预期结果的示例?请注意,
getDeclaredFields
不保证以任何顺序返回字段。它依赖于实现,可以是任意的,并且可能与
productIterator
返回的内容不一致。@Justin Pihony我刚刚更新了我的问题,很抱歉。@Wladimir MATVEEVE这将是一个问题,因为我希望各个键的确切值。。。有什么想法吗?
Map(id -> None, name -> US, states -> List(Map(id -> None, name -> CA, cities -> List(Map(id -> None, name -> LA)))))