Scala模式匹配
模式匹配在工作中比较少用到,典型的场景就是异常捕获和偏函数。
1. 模式匹配
模式匹配规范:
变量 match {
case 值 => 代码
case 值 => 代码
case - => 代码
}
模式匹配函数
import scala.util.Random
val fruits = Array("apple", "banana", "orange")
val fruit = fruits(Random.nextInt(fruits.length))
fruit match {
case "apple" => println("苹果")
case "banana" => println("香蕉")
case "orange" => println("橙子")
case _ => println("Unknown fruit.")
}
println("==================================================")
def greeting(array:Array[String]): Unit = {
array match {
case Array("scala") => println("hello scala")
case Array(x, y) => println(x + " " + y)
case Array("scala", _*) => println("Hi scala and there") // _* 代表可变参数
case Array(_*) => println("Hi there")
case _ => println("Hi there 1") // 与上面的等价
}
}
greeting(Array("scala"))
greeting(Array("scala","python"))
greeting(Array("scala","python","java"))
greeting(Array("python","java","scala"))
2. 应用场景
2.1 异常捕获
try {
// val i = 1/0
val file = Source.fromFile("test1.txt")(Codec.UTF8)
} catch {
// 模式匹配,没有顺序,完全模式匹配
case e: ArithmeticException => throw new RuntimeException("除数不能为0") // 抛出异常,程序停止
case e: FileNotFoundException => println("文件找不到") // 只打印异常,程序不停止
case e: Exception => println(e.getMessage)
case _ => println(" : ") // 剩下的情况
} finally {
println("finally")
2.2 偏函数PartialFunction
偏函数:被包在花括号内没有match的一组case语句。
偏函数可以理解为模式匹配里面的一种特殊情况,它在spark源码里面是有体现的(源码搜索PartialFunction)。
// 模式匹配函数
def sayChineseName(name:String) = name match {
case "apple" => println("苹果")
case "banana" => println("香蕉")
case "orange" => println("橙子")
case _ => println("Unknown fruit.")
}
sayChineseName("apple")
// 偏函数
/**
*
* PartialFunction[A,B]: A代表入参类型,B代表出参类型
*/
def sayChineseName2:PartialFunction[String, String] = {
case "apple" => "苹果"
case "banana" => "香蕉"
case "orange" => "橙子"
case _ => "Unknown fruit."
}
println(sayChineseName2("apple"))