鉴于以下代码,它将抛出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)
}
另外,我看到很多代码都遵循上述模式,但是案例状态并没有多大帮助,因为如果案例失败则抛出异常。我会问为什么人们会在他们的代码中使用这种模式
答案 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)