Scala Cast Any 列表到 Int 列表

Scala Cast List of Any to list of Int

给出任意列表:

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 新手。请告诉我我缺少什么。 为什么我可以从列表中转换一项,但不能通过迭代器执行此操作? 谢谢!

您给定的 ListDouble 类型。您可以简单地使用 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[Any] 相同的 List,那么您可以使用以下方法将其转换为 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)

它将给出与上面相同的输出。

似乎 String 以某种方式最终出现在您的 List l 中。

给定一个结构如下的列表(混合整数,Doubles 和 Strings):

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)

这适用于 Doubles、Ints 和 Strings。如果它在转换过程中仍然因某些异常而崩溃,那么您可以添加更多案例。当然,如果你愿意,你可以在 foreach 中做同样的事情,但在这种情况下它不会做任何事情,因为你不会 do foreach 的正文,除了铸造。这没有有用的副作用(例如,它什么都不打印)。

另一种选择是:

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

这在某种程度上对所有奇怪的输入更加宽容,至少只要所有值在某种意义上都是 "numeric"。

然而,这绝对是代码的味道:你是如何得到一个开始时包含如此多值的列表的?