1, "-6ren">
gpt4 book ai didi

scala - Scala:将 map 转换为案例类

转载 作者:行者123 更新时间:2023-12-03 10:36:15 34 4
gpt4 key购买 nike

假设我有这个案例案例类

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

我有一张 map
myMap = Map("k1" -> 1, "k2" -> "val2", "k3" -> "val3")

我需要在代码的多个位置将此映射转换为我的case类,如下所示:
myMap.asInstanceOf[Test]

最简单的方法是什么?我可以为此使用隐式吗?

最佳答案

优雅地执行此操作的两种方法。第一种是使用unapply,第二种是使用带有类型类的隐式类(2.10+)为您进行转换。

1)unapply是编写这种转换的最简单,最直接的方法。它没有任何“魔力”,如果使用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]与任何对象之间进行转换的模式仅需要另一个隐式(并且该隐式在范围内)。

关于scala - Scala:将 map 转换为案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684572/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com