当前位置: 首页 > 知识库问答 >
问题:

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

邵修诚
2023-03-14
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)
}

我试图将元组向量转换为向量[人],但上面的html" target="_blank">代码会导致强制转换异常,即使存在隐式的元组-人转换函数?

线程“main”java中出现异常。lang.ClassCastException:scala。Tuple2无法转换为示例。例如,测试$人。测试$$anonfun$2$$anonfun$应用$1。在scala应用(测试scala:19)。收集迭代器$类。scala上的foreach(迭代器。scala:727)。收集抽象迭代器。scala上的foreach(迭代器。scala:1157)。收集IterableLike$类。scala的foreach(IterableLike.scala:72)。收集可抽象。例如foreach(Iterable.scala:54)。测试$$anonfun$2。在示例中应用(测试scala:19)。测试$$anonfun$2。应用(测试scala:19)

谢谢

共有3个答案

汪皓
2023-03-14

直接使用:

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

您可以查看此答案以获取有关将mapToFutures一起使用的更多信息:将mapTo与Akka/Scala中的期货一起使用

东方俊力
2023-03-14

这是mapTo的签名:

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

它不需要任意的转换函数。删除t2p,代码仍会以同样的方式编译并失败<代码>映射到实际上执行Java样式转换,这就是为什么它需要类标记的原因。

相反,您可以这样做:

val s = f.map(vec => vec.map(Person.tupled))
岳阳飙
2023-03-14

mapTo只是尝试强制转换,因此尝试将Vector[(String, Int)]强制转换为Vector[Person]当然会失败。

您需要一个将(String,Int)转换为人的函数,该函数人的元组版本。应用

因此,更换

f.mapTo[Vector[Person]]

具有

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

 类似资料:
  • 是否可以以与选项类似的方式处理任一选项?在

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?

  • 使用一个函数将数组的值映射到对象,其键值对中,原始值作为键,映射值作为值。 使用一个匿名的内部函数作用域来声明一个 undefined 的内存空间,使用闭包来存储返回值。 使用一个新的 Array 来存储带有函数映射的数组和一个逗号运算符来返回第二个步骤,而不需要从一个上下文移动到另一个上下文(由于闭包和操作顺序)。 const mapObject = (arr, fn) => (a => (

  • 虽然向量最适合程序性编程,但我想对它们使用< code>map函数。以下代码片段有效: 为什么标准库中没有这样的函数?(以及 )。有没有其他方法可以处理它?

  • 问题内容: 我有一个具有16个属性的用户类,例如名,姓,dob,用户名,密码等。这些都存储在MySQL数据库中,当我要检索用户时,我使用ResultSet。我想将每个列映射回用户属性,但是我的操作方式似乎效率很低。例如我在做: 即我检索所有列,然后通过将所有列值插入到User构造函数中来创建用户对象。 有谁知道更快,更整洁的方法吗? 问题答案: 无需将resultSet值存储到String中,也无

  • 问题内容: 我正在尝试将JSON文件映射到类对象,然后根据新接收的JSON更新卡。 我的JSON结构是这样的 我的班级看起来像这样: 如何将JSON文件中的值映射到CardInfo类创建的对象的字段中? 更新资料 以下试用版在 ci.description上 打印为null ,是否表示从未创建该对象? 更新2 打印cardInfo给出以下内容: {$ class:FirstCard,id:1,说明