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]与任何对象之间的这种模式转换将只需要另一个隐式(并且隐含在范围内)。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |