我有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)
我怎样才能做到这一点?
您可以使用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)
你可以使用它来投射它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)