Scala模式匹配Scala类型系统Spark源码阅读
Source.fromFile(file).getLines()
}catch{
case e1: FileNotFoundException => println("FileNotFoundException")
case e2: RuntimeException => println("RuntimeException")
case e3: Exception => println("Exception")
}
因为匹配是发生在运行期的,而且JVM中泛型的类型信息会被擦掉,因此不能使用类型来匹配特定的Map类型
四:匹配数组、列表和元组
1)数组
val arr = Array(0,3,4,5,6,7)
arr match {
case Array(0) => "0"
case Array(x, y) => x + " " + y
case Array(0, x @_*) => println(x)
case _ => "something else"
}
2) 列表
val arr = List(0,4,5,6,7,)
arr match {
case List(0) => "0"
case List(x, y) => x + " " + y
case List(0, x @_*) => println(x)
case _ => "something else"
}
或者
arr match {
case 0 :: Nil => "0"
case x :: y :: Nil => x + " " + y
case 0 :: tail => "0 ..."
case _ => "something else"
}
五:提取器
模式匹配来对数组、列表和元组进行了匹配,在这个过程的背后的是提取器(extractor)机制。使用unapply来提取固定数量的对象,使用unapplySeq来提取一个序列。在前面的代码 case Array(0, x) => ...中, Array(0, x)部分实际上是使用了伴生对象中的提取器,实际调用形式是: Array.unapplySeq(arr)。根据Doc,提取器方法接受一个Array参数,返回一个Option。
1)正则表达式是另一个适用提取器的场景。正则有分组时,可以用提取器来匹配分组
val pattern = "([0-9]+) ([a-z]+)".r
"99 bottles" match {case pattern(num, item) => (num, item)}