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方法
* 2:case class 用于做匹配,性能较好(scala的底层做过优化)
* 3:case class 默认实现了序列化Serializable
* 4: case class 默认实现了toString equals等方法
* 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 }