scala - 从 List[Any] 到特定案例类的简洁方法
问题描述
我有一个List[Any]
看起来像:
val a: List[Any] = List(1, "a", "b", 2.0)
我也有一个case class
看起来像:
case class Data(field1: Int, field2: String, field3: String, field4: Double)
我想用 from 的值实例化一个case class
Dataa
,如下所示:
val d = Data(1, "a", "b", 2.0)
我知道我可以遍历a
,但是对于一个看起来很麻烦的大列表。
解决方案
如果你使用无形,
libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3"
您可以将元组应用于您的案例类,
scala> import shapeless._
import shapeless._
scala> import syntax.std.traversable._
import syntax.std.traversable._
scala> case class Data(field1: Int, field2: String, field3: String, field4: Double)
defined class Data
scala> val a: List[Any] = List(1, "a", "b", 2.0)
a: List[Any] = List(1, a, b, 2.0)
scala> (Data.apply _) tupled a.toHList[Int::String::String::Double::HNil].get.tupled
res1: Data = Data(1,a,b,2.0)
在数据类上应用元组的类型安全方法,
scala> a.toHList[Int::String::String::Double::HNil].map(_.tupled).map(t => (Data.apply _) tupled t)
res2: Option[Data] = Some(Data(1,a,b,2.0))
推荐阅读
- cassandra - IP v6 地址套接字创建失败并出现“无法创建 SSL 套接字”错误
- saml-2.0 - SAML 错误“SignatureStatus:NOT_PRESENT”
- android - OpenSLES:SL_RESULT_CONTENT_UNSUPPORTED
- ibm-cloud - 无法在 lite plan 下创建云对象存储桶
- python-3.x - 与其他两个整数相比,查找最接近的整数键/值对
- javascript - 如何创建一个大的 ArrayBuffer 进行测试?
- php - MySQL order By date time 字段,如果存在相同的日期,则为 Rand()
- ios - 如何始终从 NSError 获取英文字符串?
- python - 如何使用另一个 ndarray 屏蔽一个 ndarray
- python - 删除字符串中以某些字符开头的行