加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala:将地图转换为案例类

发布时间:2020-12-16 09:32:47 所属栏目:安全 来源:网络整理
导读:假设我有这个例子的case类 case class Test(key1: Int,key2: String,key3: String) 我有一张地图 myMap = Map("k1" - 1,"k2" - "val2","k3" - "val3") 我需要在代码的几个地方将此地图转换为我的案例类,如下所示: myMap.asInstanceOf[Test] 最简单的做法是
假设我有这个例子的case类

case class Test(key1: Int,key2: String,key3: String)

我有一张地图

myMap = Map("k1" -> 1,"k2" -> "val2","k3" -> "val3")

我需要在代码的几个地方将此地图转换为我的案例类,如下所示:

myMap.asInstanceOf[Test]

最简单的做法是什么?我可以以某种方式使用隐含的吗?

解决方法

两种做法优雅。第一个是使用未应用程序,第二个是使用类型类的隐式类(2.10)为您进行转换。

1)未应用是编写这种转换的最简单和最直接的方式。它不会做任何“魔术”,如果使用IDE可以很容易地找到。请注意,做这样的事情可能会混淆你的伴侣对象,并导致你的代码在你可能不想要的地方发芽依赖:

object MyClass{
  def unapply(values: Map[String,String]) = try{
    Some(MyClass(values("key").toInteger,values("next").toFloat))
  } catch{
    case NonFatal(ex) => None
  }
}

可以这样使用:

val MyClass(myInstance) = myMap

要小心,因为如果不完全匹配会抛出异常。

2)使用类型类执行隐式类为您创建更多的样板,但也允许大量空间来扩展相同的模式以应用于其他案例类:

implicit class Map2Class(values: Map[String,String]){
  def convert[A](implicit mapper: MapConvert[A]) = mapper conv (values)
}

trait MapConvert[A]{
  def conv(values: Map[String,String]): A
}

作为一个例子,你会做这样的事情:

object MyObject{
  implicit val new MapConvert[MyObject]{
    def conv(values: Map[String,String]) = MyObject(values("key").toInt,values("foo").toFloat)
  }
}

然后可以像上面所描述的那样使用它们:

val myInstance = myMap.convert[MyObject]

如果不能进行转换,则抛出异常。使用Map [String,String]与任何对象之间的这种模式转换将只需要另一个隐式(并且隐含在范围内)。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读