从List [Any]到特定案例类的简洁方法

jst*_*ill 0 scala

我有一个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,但是对于一个看起来很麻烦的大型列表.

pra*_*upd 6

如果你使用无形,

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)

  • 这个答案很好,但是未经检查的`.get`会让你停下来. (2认同)