在 scala 2.10 中绕过 [SI-6976] 进行原始集合模式匹配的最简单方法是什么?
What's the easiest way to circumvent [SI-6976] in scala 2.10 for primitive collection pattern matching?
我有一个简单的功能:
implicit class ArrayView[A](self: Array[A]) {
def filterByType[B <: A: ClassTag]: Array[B] = {
val ctg = implicitly[ClassTag[B]]
val runtimeClazz = ctg.runtimeClass
self.flatMap{
v =>
if (v.getClass.isAssignableFrom(runtimeClazz)) Some(v.asInstanceOf[B])
else None
}.toArray
}
}
和一个简单的测试用例:
assert(Array(1, 2.2, "a").filterByType[Int].toSeq == Seq(1))
assert(Array(1, 2.2, "a").filterByType[java.lang.Integer].toSeq == Seq(1: java.lang.Integer))
assert(Array(1, 2.2, "a").filterByType[Double].toSeq == Seq(2.2))
assert(Array(1, 2.2, "a").filterByType[java.lang.Double].toSeq == Seq(2.2: java.lang.Double))
assert(Array(1, 2.2, "a").filterByType[String].toSeq == Seq("a"))
它只适用于Scala >2.11.3(因为https://issues.scala-lang.org/browse/SI-6967,这已经有一段时间了),但是很多库(例如spark-hive_thriftserver)仍然有问题移植到2.11,而 2.10 在大多数其他情况下基本稳定,是否有针对此错误的快速补丁?
好吧,这真的很时髦,但无论如何:
implicit class ArrayView[A](self: Array[A]) {
def filterByType[B <: A: ClassTag]: Array[B] = {
self.flatMap{
v =>
try {
Array[B](v.asInstanceOf[B])
}
catch {
case e: Throwable =>
Array[B]()
}
}.toArray
}
}
通过所有测试
我有一个简单的功能:
implicit class ArrayView[A](self: Array[A]) {
def filterByType[B <: A: ClassTag]: Array[B] = {
val ctg = implicitly[ClassTag[B]]
val runtimeClazz = ctg.runtimeClass
self.flatMap{
v =>
if (v.getClass.isAssignableFrom(runtimeClazz)) Some(v.asInstanceOf[B])
else None
}.toArray
}
}
和一个简单的测试用例:
assert(Array(1, 2.2, "a").filterByType[Int].toSeq == Seq(1))
assert(Array(1, 2.2, "a").filterByType[java.lang.Integer].toSeq == Seq(1: java.lang.Integer))
assert(Array(1, 2.2, "a").filterByType[Double].toSeq == Seq(2.2))
assert(Array(1, 2.2, "a").filterByType[java.lang.Double].toSeq == Seq(2.2: java.lang.Double))
assert(Array(1, 2.2, "a").filterByType[String].toSeq == Seq("a"))
它只适用于Scala >2.11.3(因为https://issues.scala-lang.org/browse/SI-6967,这已经有一段时间了),但是很多库(例如spark-hive_thriftserver)仍然有问题移植到2.11,而 2.10 在大多数其他情况下基本稳定,是否有针对此错误的快速补丁?
好吧,这真的很时髦,但无论如何:
implicit class ArrayView[A](self: Array[A]) {
def filterByType[B <: A: ClassTag]: Array[B] = {
self.flatMap{
v =>
try {
Array[B](v.asInstanceOf[B])
}
catch {
case e: Throwable =>
Array[B]()
}
}.toArray
}
}
通过所有测试