Scala将任意列表转换为Int列表

Scala将任意列表转换为Int列表,scala,int,double,any,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 jav

给出以下各项的清单:

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(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
我是斯卡拉的新手。请告诉我我错过了什么。 为什么我可以从列表中强制转换一个项目,但不能通过迭代器执行此操作?
谢谢

您给定的
列表
类型为
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)

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

似乎一个
字符串
不知何故出现在您的
列表中

给定如下结构的列表(使用混合整数、
Double
s和
String
s):

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

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

println(lAsInts)
这适用于
Double
s、
Int
s和
String
s。如果在强制转换过程中仍出现一些异常而崩溃,则可以添加更多案例。当然,如果愿意,您可以在
foreach
中执行相同的操作,但在这种情况下,它不会执行任何操作,因为在
foreach
的主体中,除了铸造之外,您不会执行任何操作。这没有任何有用的副作用(例如,它不打印任何内容)

另一种选择是:

lAsInts = l.map{_.toString.toDouble.toInt}
这在某种程度上对所有奇怪的输入都更加宽容,至少只要所有的值在某种意义上都是“数字”


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

这是一个很长的故事。我有一些json,有许多不同类型的属性。我从Redis中提取了这些数据,并用scala.util.parsing.json进行了解析。它返回了Map[String,Any],但在解析后,它将字符串类型为“29940714”的值转换为Any 2.9940714E7。然后我用case类映射得到的映射,使其具有具有必要数据的对象,然后根据一些属性进行过滤。无论如何,toString.toDouble.toInt工作得很好。谢谢!