将scala元组包装到自定义类对象

时间:2013-07-05 08:27:25

标签: scala tuple-packing

我有一个元组

val tuple = ("Mike", 40)

和案例类

case class Person(name: String, age: Int)

如何将我的元组打包到Person类的对象?除此之外有什么办法:

new Person(tuple._1, tuple._2)

也许喜欢

tuple.asInstanceOf[Person]

感谢。

3 个答案:

答案 0 :(得分:29)

<强> tupled

您可以将Person.apply方法转换为函数,然后在函数上使用tupled方法:

(Person.apply _) tupled tuple

scala 2.11.8scala 2.12 case class的{​​{1}}广告FunctionN的同伴对象,所以这就足够了:

Person tupled tuple

模式匹配

new Person(tuple._1, tuple._2)类似于没有丑陋的_N方法的模式匹配:

tuple match { case (name, age) => Person(name, age) }

答案 1 :(得分:3)

小“只是为了好玩”的版本,可以进一步抽象。当然还有shapeless的一点帮助:

  import shapeless._
  import Tuples._

  case class Person(name: String, age: Int)
  val tup = ("Alex", 23)

  val personIso = Iso.hlist(Person.apply _, Person.unapply _)

  personIso.from(tup.hlisted)

答案 2 :(得分:1)

您可以定义执行转换的隐式。 我在参数化测试中使用它来提高可读性。

// Define adults with tuples
implicit def makePerson(in:(String,Int))=new Person(in._1,in._2);
// Define kids with triples
implicit def makeUnderagePerson(in:(String, Int, String))=new Person(in._1,in._2, new Person(in._3));

//create single person:
val person:Person=("Mike", 40)

//crate a list of persons:
//
//Remember to type the list, this is what forces the implicit on each tuple.
//                     ||
//                     \/
val personList=List[Person](
("Mike", 40),
("Jane", 41),
("Jack", 42),
// Uses the implicit ment for kids. 
("Benjamin", 5, Jack)
);

我喜欢这种语言。