当前位置: 首页 > 知识库问答 >
问题:

Scala:将映射转换为case类

程仲卿
2023-03-14
case class Test(key1: Int, key2: String, key3: String)
myMap = Map("k1" -> 1, "k2" -> "val2", "k3" -> "val3")

我需要在代码的几个地方将这个映射转换为我的case类,如下所示:

myMap.asInstanceOf[Test]

最简单的方法是什么?我能用隐式吗?

共有1个答案

长孙谦
2023-03-14

两种优雅的方法。第一种方法是使用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的程序- 输出结果