斯卡拉映射元组矢量对对象矢量

时间:2015-06-24 20:53:47

标签: scala slick

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

我正在尝试将元组的Vector转换为Vector [Person]但是上面的代码导致了一个转换异常,即使有一个隐式元组到Person转换函数?

线程中的异常" main" java.lang.ClassCastException:scala.Tuple2无法强制转换为example.test $ Person     at example.test $$ anonfun $ 2 $$ anonfun $ apply $ 1.apply(test.scala:19)     在scala.collection.Iterator $ class.foreach(Iterator.scala:727)     在scala.collection.AbstractIterator.foreach(Iterator.scala:1157)     在scala.collection.IterableLike $ class.foreach(IterableLike.scala:72)     在scala.collection.AbstractIterable.foreach(Iterable.scala:54)     at example.test $$ anonfun $ 2.apply(test.scala:19)     at example.test $$ anonfun $ 2.apply(test.scala:19)

感谢。

3 个答案:

答案 0 :(得分:3)

std::terminate()只是尝试投射,因此当然尝试将mapTo投射到Vector[(String, Int)]将会失败。

您需要一个将Vector[Person]转换为(String, Int)的函数,该函数是Person的三元组版本。

因此,替换

Person.apply

f.mapTo[Vector[Person]]

答案 1 :(得分:0)

直接使用:

  val f:Future[Vector[Person]] = Future {
    Vector(("One", 1), ("Two", 2))
  }

有关将mapToFuture一起使用的更多信息,您可以看到此答案:Using mapTo with futures in Akka/Scala

答案 2 :(得分:0)

以下是mapTo的签名:

def mapTo[S](implicit tag: ClassTag[S]): Future[S]

它不需要任意转换功能。删除t2p,代码仍然会以相同的方式编译和失败。 mapTo实际上执行了Java样式的转换,这就是它需要ClassTag

的原因

相反,你可以这样做:

val s = f.map(vec => vec.map(Person.tupled))