Scala:用另一个类型列表压缩列表?

时间:2017-03-23 23:22:13

标签: scala

是否可以做这样的事情:

val xs = List("a", "1", "5.3")
(xs zip List(String, Int, Double)).map{
   case (e, t) => e.asInstanceOf[t]
}

如您所见,我正在尝试将字符串列表解析为正确的类型。

当然上面的内容不起作用,特别是对于“String”部分。编译器抱怨error: object java.lang.String is not a value

修改 我知道这不是以上述方式可行的。你能提出一个很好的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

您想要的是将转化器列表String => StringString => IntString => Double应用于您的字符串列表。

这可以通过将实际转换器(而不是类型)传递到列表来完成:

xs.zip(List(x => x, x => x.toInt, x => x.toDouble)).map {
  case (str, conv) => conv(str)
}

但是,由于列表中的元素必须具有相同的类型,因此这将为您提供List[Any],并且您将失去所有强类型的优势。

我认为最简单的解决方案是不要尝试按照List进行转换,而是按照您的业务逻辑进行转换:

val s: String = xs(0)
val i: Int = xs(1).toInt
val d: Double = xs(2).toDouble

如果您坚持使用List - 就像转换一样,您可以尝试无形HListPoly,但这需要对类型理论有一个强有力的基本理解,所以我' d而不是在这个答案中钻研它。

答案 1 :(得分:1)

你实际上可以写一个合法的等同于

(xs zip List(String, Int, Double)).map{
   case (e, t) => e.asInstanceOf[t]
}

它的

(xs zip List(classOf[String], classOf[Int], classOf[Double])).map{
   case (e, t) => t.cast(e)
}

但当然它会引发异常,就像你的原始代码一样,因为例如"1"不是Int,而是String