Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。类似于Java的switch语句,但更加强大
语法 val a mathc{
case xxxx = > xxx
case xxxx=> xxx}
并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配
1、匹配字符串
import scala.util.Random
object CaseDemo01 extends App{
val arr = Array("Hadoop", "HBase", "Spark")
val name = arr(Random.nextInt(arr.length))
name match {
case "Hadoop" => println("哈肚普...")
case "HBase" => println("H贝斯...")
case _ => println("真不知道你们在说什么...")//类似于default
}}
2、匹配类型
import scala.util.Random
object CaseDemo01 extends App{
//val v = if(x >= 5) 1 else if(x < 2) 2.0 else "hello"
val arr = Array("hello", 1, 2.0, CaseDemo01)
val v = arr(Random.nextInt(4))
println(v)
v match {
case x: Int => println("Int " + x)
case y: Double if(y >= 0) => println("Double "+ y)
case z: String => println("String " + z)
case _ => throw new Exception("not match exception")
}
}
3、匹配数组、元组、集合
object CaseDemo03 extends App{
val arr = Array(1, 3, 5)
arr match {
case Array(1, x, y) => println(x + " " + y)
case Array(0) => println("only 0")
case Array(0, _*) => println("0 ...")
case _ => println("something else")
}
val lst = List(3, -1)
lst match {
case 0 :: Nil => println("only 0")
case x :: y :: Nil => println(s"x: $x y: $y")
case 0 :: tail => println("0 ...")
case _ => println("something else")
}
val tup = (2, 3, 5)
tup match {
case (2, x, y) => println(s"1, $x , $y")
case (_, z, 5) => println(z)
case _ => println("else")
}
}
4、样例类case class
在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的
import scala.util.Random
case class SubmitTask(id: String, name: String)
case class HeartBeat(time: Long)
case object CheckTimeOutTask
object CaseDemo04 extends App{
val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001"))
arr(Random.nextInt(arr.length)) match {
case SubmitTask(id, name) => {
println(s"$id, $name")//字符串组合方式
}
case HeartBeat(time) => {
println(time)
}
case CheckTimeOutTask => {
println("check")
}
}
}
样例类主要用于模式匹配,在RPC中使用,案例这里
本质上来讲,class case class用起来就是一样的:
最不一样的一个东西:如果我们scala要做模式匹配,去匹配类型的话,建议使用
case case 因为scala的底层对它做了优化,匹配起来性能较好。* 1:case class 自动生成伴生对象,自动实现了apply方法
* 5:case class 主构造函数 里面没有修饰符,默认的是val
偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,与常规相比省略了match关键字,常用作输入模式匹配
def func1: PartialFunction[String, Int] = {
case "one" => 1
case "two" => 2
case _ => -1
}