跳过坏元素而不是抛出scala.MatchError

时间:2017-06-02 10:23:37

标签: scala

鉴于以下代码,它将抛出scala.MatchError,因为"Hello"与案例陈述不匹配。

我想要的是,当map遇到一个与case语句不匹配的元素时,它不会抛出异常但只是跳过它,因此结果为data2只会包含通过map

的元素

我会问如何实现此功能

  def testCaseMatch(): Unit = {
    val data = List((1, 2), (3, 4), "Hello")
    val data2 = data.map {
      case (x, y) => x + " " + y
    }
    println(data2)
}

另外,我看到很多代码都遵循上述模式,但是案例状态并没有多大帮助,因为如果案例失败则抛出异常。我会问为什么人们会在他们的代码中使用这种模式

2 个答案:

答案 0 :(得分:2)

您可以filter要操作的元素,

scala> val data = List((1, 2), (3, 4), "Hello")
data: List[java.io.Serializable] = List((1,2), (3,4), Hello)

scala> data.filter(_.isInstanceOf[Tuple2[Int, Int]]).map {case(a, b) => s"$a $b"}
res5: List[String] = List(1 2, 3 4)

collect相同,

scala> data.collect {case(a, b) => s"$a $b"}
res6: List[String] = List(1 2, 3 4)

参考

Scala: Can there be any reason to prefer filter+map over collect?

答案 1 :(得分:1)

使用collect代替map

val data = List((1, 2), (3, 4), "Hello")
val data2 = data.collect {
  case (x, y) => x + " " + y
}
println(data2) // List(1 2, 3 4)