模式匹配scala中的List

时间:2018-04-20 16:35:49

标签: json scala pattern-matching sequence

所以我尝试模式匹配已从List转换的自定义对象的Json。编译器无法确定Sequences的内容,例如List[Int]List[String]相同,因此我目前无法区分不同的对象,因此无法正确处理它们。

我已经检索了Json个数据transformed,然后成功将其映射到我的模型,因此myFunction(下方)是造成问题的部分 - 无法使用识别数据类型:

  trait SuperT

  case class User(firstname: String, firstname: String, dob: Option[Date]) extends SuperT

  case class Country(name: String, continent: Option[String], hemisphere: Option[String]) extends SuperT

  def myFunction(jsRes: JsResult[Seq[SuperT]])(implicit request: Request[AnyContent]) = {

    jsRes match {
      case JsSuccess(data: List[SuperT], path: JsPath) => data match {
        // cannot find the differences between the following 2 case types
        case u: List[User] => Ok(views.html.db.user.index(Some(u))
        case c: List[RgnM] => Ok(views.html.db.country.index(Some(c))
      }
      case e: JsError => Ok(JsError.toJson(e))
    }

  }

感谢任何帮助或见解!

1 个答案:

答案 0 :(得分:1)

  

它相似但不一样,重要的是这个问题的解决方案似乎没有帮助

问题 与@markusthoemmes链接问题完全相同。但是,可能并不明显哪些解决方案适用以及如何进行调整,尤其是在没有足够的Scala经验的情况下。

如果您只是从某处获得了List[SuperT],那么基于Manifest / ClassTag / TypeTag的解决方案将无济于事。他们需要在某个阶段List[User]

case JsSuccess(data: List[SuperT], path: JsPath) => data match {
  case first :: _ =>
    first match {
      case _: User => 
        Ok(views.html.db.user.index(Some(data.asInstanceOf[List[User]]))
      case _: Country =>
        Ok(views.html.db.country.index(Some(data.asInstanceOf[List[Country]]))
    }
  case _ => // what do you want to do if the list is empty (or null)?
}
如果您认为列表仅包含User s或仅包含Country es,则

应该有效。否则,您可以使用partitiongroupBy按类拆分列表,并决定如何处理每个列表。

但你也应该考虑为什么你首先有一个List[SuperT];在您创建它的那一刻,您是否有关于响应中是否包含用户或国家/地区的信息?如果你这样做,它可以与列表一起传递并解决你的问题,而不会出现类型匹配的丑陋。