我有一个List[Any]看起来像:
val a: List[Any] = List(1, "a", "b", 2.0)
Run Code Online (Sandbox Code Playgroud)
我也有一个case class看起来像:
case class Data(field1: Int, field2: String, field3: String, field4: Double)
Run Code Online (Sandbox Code Playgroud)
我想使用以下值来实例化case class 数据a:
val d = Data(1, "a", "b", 2.0)
Run Code Online (Sandbox Code Playgroud)
我知道我可以迭代a,但是对于一个看起来很麻烦的大型列表.
如果你使用无形,
libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.3"
Run Code Online (Sandbox Code Playgroud)
您可以将元组应用于您的案例类,
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)
Run Code Online (Sandbox Code Playgroud)
在数据类上应用元组的类型安全方法,
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))
Run Code Online (Sandbox Code Playgroud)