我有一个元组
val tuple = ("Mike", 40)
和案例类
case class Person(name: String, age: Int)
如何将我的元组打包到Person类的对象?除此之外有什么办法:
new Person(tuple._1, tuple._2)
也许喜欢
tuple.asInstanceOf[Person]
感谢。
答案 0 :(得分:29)
<强> tupled 强>
您可以将Person.apply
方法转换为函数,然后在函数上使用tupled
方法:
(Person.apply _) tupled tuple
scala 2.11.8
和scala 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)
);
我喜欢这种语言。