Scala将元组向量映射到对象向量
我试图将元组向量转换为向量[Person],但是上面的代码导致了一个强制转换异常,即使有一个隐式的元组到Person转换函数 线程“main”java.lang.ClassCastException中的异常:scala.Tuple2无法转换为example.test$Person 例如.test$$anonfun$2$$anonfun$apply$1.apply(test.scala:19) 位于scala.collection.Iterator$class.foreach(Iterator.scala:727) 位于scala.collection.AbstractIterator.foreach(迭代器.scala:1157) 位于scala.collection.IterableLike$class.foreach(IterableLike.scala:72) 位于scala.collection.AbstractIterable.foreach(Iterable.scala:54) 例如.test$$anonfun$2.apply(test.scala:19) 例如.test$$anonfun$2.apply(test.scala:19) 谢谢。直接使用:Scala将元组向量映射到对象向量,scala,slick,Scala,Slick,我试图将元组向量转换为向量[Person],但是上面的代码导致了一个强制转换异常,即使有一个隐式的元组到Person转换函数 线程“main”java.lang.ClassCastException中的异常:scala.Tuple2无法转换为example.test$Person 例如.test$$anonfun$2$$anonfun$apply$1.apply(test.scala:19) 位于scala.collection.Iterator$class.foreach(Iterator.s
import scala.concurrent.duration._
import scala.language.implicitConversions
import scala.concurrent.{Future, Await}
import scala.concurrent.ExecutionContext.Implicits.global
object test extends App {
case class Person(name: String, age: Int)
implicit def t2p(t: (String, Int)) : Person = Person(t._1, t._2)
val f:Future[Vector[(String, Int)]] = Future {
Vector(("One", 1), ("Two", 2))
}
val s = f.mapTo[Vector[Person]]
Await.result(s.map { _ foreach { x => println(x)}}, 5.seconds)
}
您可以查看此答案,了解有关将
mapTo
与Future
s一起使用的更多信息:mapTo
只是尝试强制转换,因此尝试将Vector[(String,Int)]
转换为Vector[Person]
当然会失败
您需要一个将(String,Int)
转换为Person
的函数,该函数是Person.apply的元组版本
因此,替换
val f:Future[Vector[Person]] = Future {
Vector(("One", 1), ("Two", 2))
}
与
这是mapTo
的签名:
f.map(_.map(Person.tupled))
它不需要任意的转换函数。删除t2p
,代码仍将以相同的方式编译并失败mapTo
实际上执行Java样式转换,这就是为什么它需要ClassTag
相反,您可以这样做:
def mapTo[S](implicit tag: ClassTag[S]): Future[S]
我用vals=f.map(x=>x.map(y=>Person(y.。_1,y.。_2,y.。_3))替换了f.map到[Vector[Person]
)
但是你的更好,谢谢。
def mapTo[S](implicit tag: ClassTag[S]): Future[S]
val s = f.map(vec => vec.map(Person.tupled))