如何在Scala中将List [Any]转换为List(Int,Int)?

Mah*_*hah 2 scala

我有List[Any]哪些有价值

List((0,0), (1,1), (1,3), (2,2), (3,1))
Run Code Online (Sandbox Code Playgroud)

我想把它转换成

List[(Int,Int)]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

gro*_*ter 7

您可以使用collect方法,以便在List不仅包含Ints元组的情况下也不会失败

val l: List[Any]  = List((0,0), (1,1), (1,3), (2,2), (3,1))
l.collect{ case (a: Int, b: Int) => (a,b)}
Run Code Online (Sandbox Code Playgroud)


Chr*_*tin 5

你可以使用它来投射它asInstanceOf.

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

scala> a.asInstanceOf[List[(Int, Int)]]
res0: List[(Int, Int)] = List((0,0), (1,1), (1,3), (2,2), (3,1))
Run Code Online (Sandbox Code Playgroud)

虽然这是部分擦除的危险.看看它如何造成堆污染:

scala> val a: List[Any] = List((0,0), (1,1), "abc")
a: List[Any] = List((0,0), (1,1), abc)

scala> a.asInstanceOf[List[(Int, Int)]]
res0: List[(Int, Int)] = List((0,0), (1,1), abc)
Run Code Online (Sandbox Code Playgroud)

所以只有在性能成为这里的一个大问题时才这样做.否则,我更喜欢其他两个答案中的一个(总结如下).

如果你想以ClassCastException(@mattinbits的答案)的形式失败:

a.map(_.asInstanceOf[(Int, Int)])
Run Code Online (Sandbox Code Playgroud)

如果你想要无声地传递失败(@ grotrianster的回答):

a.collect({ case (a: Int, b: Int) => (a, b) })
Run Code Online (Sandbox Code Playgroud)