2015-06-24 61 views
2
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 [人]但上面的代码结果在铸造例外即使存在隐式的元组和Person的转换功能?Scala的元组的矢量映射到对象的矢量

线程“main”中的异常java.lang.ClassCastException:scala.Tuple2无法转换为example.test $ Person at example.test $$ anonfun $ 2 $$ anonfun $ apply $ 1.apply(test.scala: 19) at scala.collection.Iterator $ class.foreach(Iterator.scala:727) at scala.collection.AbstractIterator.foreach(Iterator.scala:1157) at scala.collection.IterableLike $ class.foreach(IterableLike。 Scala:72) at 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

mapTo只是试图铸造,所以当然想投Vector[(String, Int)]Vector[Person]是会失败。

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

因此,

f.map(_.map(Person.tupled)) 
+0

我取代'f.mapTo [矢量[人]]'和'VAL S = f.map(X => x.map(Y =>人员( y._1,y._2,y._3)))''但你的更好,谢谢。 – user3217212

0

更换

f.mapTo[Vector[Person]] 

这里是mapTo签名:

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

它并不需要任意转换功能。删除你的t2p,代码仍然会以相同的方式编译和失败。 mapTo实际上执行Java风格的演员,这就是为什么它需要ClassTag

相反,你可以这样做:

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