将List [Any]重新解释为List [Int]

Cor*_*ein 4 types casting scala list type-conversion

我有一个List我确定只包含Int成员,但列表是类型List[Any].我需要对这个列表中的数字求和,但我不能使用+运算符,因为它没有定义Any.

scala> val l = List[Any](1, 2, 3)
l: List[Any] = List(1, 2, 3)

scala> l.foldLeft(0)(_ + _)
<console>:9: error: overloaded method value + with alternatives:
  (x: Int)Int <and>
  (x: Char)Int <and>
  (x: Short)Int <and>
  (x: Byte)Int
 cannot be applied to (Any)
              l.foldLeft(0)(_ + _)
                              ^
Run Code Online (Sandbox Code Playgroud)

我尝试将它转换为List[Int]通道l.map(_.toInt)但当然因为完全相同的原因而失败了.

鉴于List[Any]这实际上是一个整数列表,我该如何将其转换为List[Int]

对于好奇,这就是我到达这里的方式:

scala> val l = List(List("x", 1), List("y", 2))
l: List[List[Any]] = List(List(x, 1), List(y, 2))

scala> l.transpose
res0: List[List[Any]] = List(List(x, y), List(1, 2))
Run Code Online (Sandbox Code Playgroud)

Rya*_*yan 13

投射列表元素的最安全方法是使用collect:

val l: List[Any] = List(1, 2, 3)

val l2: List[Int] = l collect { case i: Int => i }
Run Code Online (Sandbox Code Playgroud)

collect过滤器和映射列表的元素,因此任何非int的元素都将被忽略.只包含那些与case语句匹配的元素.

OTOH,解决这个问题的最好办法就是永远不要拥有一个List[Any].我会解决这个问题,而不是试图施展.

  • 如果列表元素实际上是行的表示,那么使用元组而不是列表会更好. (3认同)
  • 天啊我什么时候才能记住所有这些令人敬畏的lambdas.谢谢@TravisBrown.我爱斯卡拉. (2认同)