在原始集合模式匹配中,在scala 2.10中绕过[SI-6976]的最简单方法是什么?

时间:2016-04-07 17:43:45

标签: scala pattern-matching scala-collections scala-2.10

我有一个简单的功能:

  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&gt; 2.11.3(由于https://issues.scala-lang.org/browse/SI-6967,这已经有一段时间了),但许多库(例如spark-hive_thriftserver)仍然存在移植到2.11的问题,而对于大多数其他情况,2.10已基本稳定,是否有针对此错误的快速补丁?

1 个答案:

答案 0 :(得分:1)

好的,这真的很时髦,但无论如何:

  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
    }
  }

通过所有测试