Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala将元组向量映射到对象向量_Scala_Slick - Fatal编程技术网

Scala将元组向量映射到对象向量

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

我试图将元组向量转换为向量[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)

谢谢。

直接使用:

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))