首页 > 解决方案 > 从 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,但是对于一个看起来很麻烦的大列表。

标签: scala

解决方案


如果你使用无形,

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))

推荐阅读