Scala Cast列出任何列表的Int

时间:2018-02-12 09:49:22

标签: scala int double any

给出任意列表:

val l = List(2.9940714E7, 2.9931662E7, 2.993162E7, 2.9931625E7, 2.9930708E7, 2.9930708E7, 2.9931477E7)

我需要将每个项目转换为Int。

使用:

l(1).asInstanceOf[Double].toInt

不会

l.foreach{_.asInstanceOf[Double].toInt}
> java.lang.String cannot be cast to java.lang.Double

如果

l.foreach{_.asInstanceOf[String].toDouble.toInt}
> java.lang.Double cannot be cast to java.lang.String

我是Scala的新手。请告诉我我错过了什么。 为什么我可以从列表中转换一个项目,但不能通过迭代器执行此操作? 谢谢!

2 个答案:

答案 0 :(得分:3)

您的List类型为Double。您只需使用map操作即可将其转换为Int类型。尝试以下代码,

val l: List[Double] = List(2.9940714E7, 2.9931662E7, 2.993162E7, 2.9931625E7, 2.9930708E7, 2.9930708E7, 2.9931477E7)

//simply map the list and use toInt
val intLst: List[Int] = l.map(_.toInt)

print(intLst)

//output
//List(29940714, 29931662, 29931620, 29931625, 29930708, 29930708, 29931477)

但是假设您与List具有相同的List[Any],那么您可以使用以下内容将其转换为Int

val l: List[Any] = List(2.9940714E7, 2.9931662E7, 2.993162E7, 2.9931625E7, 2.9930708E7, 2.9930708E7, 2.9931477E7)

val intLst: List[Int] = l.map(_.asInstanceOf[Double].toInt)

它将提供与上面相同的输出。

答案 1 :(得分:2)

似乎String以某种方式结束了List l

给定一个像这样结构的列表(混合整数,DoubleString s):

val l = List[Any](2.9940714E7, 2.9931625E7, "2.345E8", 345563)

您可以将其转换为整数列表,如下所示:

val lAsInts = l.map {
  case i: Int => i
  case d: Double => d.toInt
  case s: String => s.toDouble.toInt
}

println(lAsInts)

这适用于DoubleIntString。如果在演员表中它仍有一些例外情况崩溃,那么你可以添加更多案例。当然,如果你愿意,你可以在foreach中做同样的事情,但在这种情况下,它不会做任何事情,因为你不能做任何事情除了铸造之外foreach的主体。这没有任何有用的副作用(例如它什么都不打印)。

另一种选择是:

lAsInts = l.map{_.toString.toDouble.toInt}

这对所有类型的奇怪输入都更加宽容,至少只要所有值都是"数字"从某种意义上说。

然而,这绝对是代码味道:你是如何得到一个包含如此疯狂的价值观的列表?