case class Test(key1: Int, key2: String, key3: String)
myMap = Map("k1" -> 1, "k2" -> "val2", "k3" -> "val3")
我需要在代码的几个地方将这个映射转换为我的case类,如下所示:
myMap.asInstanceOf[Test]
最简单的方法是什么?我能用隐式吗?
两种优雅的方法。第一种方法是使用unapply
,第二种方法是使用带有type类的隐式类(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)使用type类创建隐式类可以为您创建更多的样板,但也允许大量空间来扩展相同的模式以应用于其他case类:
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]
我有两个嵌套的case类: 当然,解决方案应该是泛型的,并且适用于任何case类。 注意:这个讨论很好地回答了如何将单个case类映射到映射。但我无法将其用于嵌套的case类。相反,我得到了:
我一直在研究Jackson,但似乎必须将映射转换为JSON,然后将生成的JSON转换为POJO。 有没有一种方法可以将地图直接转换成POJO?
我试图在Go中创建一个泛型方法,该方法将使用来自< code > map[string]interface { } 的数据填充< code>struct。例如,方法签名和用法可能如下所示: 我知道使用JSON作为中介可以做到这一点;有没有其他更有效的方法?
我试图用scala编写一个udf函数,并在pyspark工作中使用它。我的数据帧模式是 我正在尝试编写一个udf函数 在这个map函数中,我试图将行强制转换为case类,但无法。我犯了这个错误。 java.lang.ClassCast异常:org.apache.spark.sql.catalyst.expressions.GenericRowwith模式不能强制转换为变量计算变量计算$myRow3
本文向大家介绍Java 将Map映射转换为 List,包括了Java 将Map映射转换为 List的使用技巧和注意事项,需要的朋友参考一下 首先,让我们创建一个Java Map并初始化- 现在,将Map转换为List- 示例 以下是在Java中将Maps转换为List的程序- 输出结果