如何将以下数组转换为Array [(Long,Long,Long)]
类型之一Array[(Any, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))
我已尝试映射第一个元素test.map(x => (x._1).toLong)
但我得到
错误:值toLong不是Any
的成员
答案 0 :(得分:1)
问题不完整。首先为什么第一个元组元素的类型为Any
,我们怎么知道如何将它转换为Long?答案可能会有很大的不同,具体取决于该对象的运行时类型。
Kao也没有回答这个问题,即如何将其变成Array[(Long, Long, Long)]
,而不是Array[Long]
。
基本上有两种方法可以做到这一点。使用复制方法:
test map {x => x.copy(_1 = x._1.…)}
或使用部分函数文字:
test map {case (x,y,z) => (x.…, y, z)}
虽然前者略显简洁,但后者为您提供了额外的可能性。例如,您可以使用collect
方法删除无法转换的元素,也可以处理不同类型的值,例如BigInt和BigInteger:
test collect {
case (x: BigInt, y, z) => (x.longValue, y, z)
case (x: BigInteger, y, z) => (x.longValue, y, z)
}
(注意:如果BigInts实际上不适合长,那么此代码将返回虚假值,因此应该在生产代码中检查它。)
答案 1 :(得分:0)
您需要告诉编译器您尝试映射的Any
元素的类型是什么。您可以使用asInstanceOf
。
val t: Array[(Any, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))
t.map(x=> x._1.asInstanceOf[Number].longValue)
输出:
Array[Long] = Array(20090216, 20090711)
您可能需要在Try
中对此进行保护,以确保不会出现例外情况。
编辑:
如果您只希望拥有类型(Long, Long, Long)
的数组,最简单的方法就是转换整个数组。现在再次,你应该将它包装在Try
。
val t: Array[(Any, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))
val x = t.asInstanceOf[Array[(Long, Long, Long)]]
输出:
Array[(Long, Long, Long)] = Array((20090216,152,2743012), (20090711,83,2743012))