简介
Scala中最大的强大的机制是模式匹配的机制。可以应用到很多场合:如switch语句、类型检查等。并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配
字符串的匹配
package cn.edu.hust.cases import scala.util.Random object StringDemo{ def main(args: Array[String]): Unit = { //println("hello,scala") val list = List("hello", "Scala", "java") val s = list(Random.nextInt(3)) s match { case "hello" => println("hello,world") case "java" => println("java") case _ => println("others") } println("hello") } }
类型匹配
package cn.edu.hust.cases import scala.util.Random object TypeDemo { def main(args: Array[String]): Unit = { val list=List(1,"abc",TypeDemo) val s=list(Random.nextInt(list.length)) //对于类型进行匹配 s match{ case a : Int if(a > -1) => println(a) case a : String => println("字符串") case TypeDemo => println(TypeDemo) } } }
数组匹配
package cn.edu.hust.cases object ArrayMatch extends App{ val array=Array(1,2,3,4,19) //进行array的匹配 array match{ case Array(2,3,x) => println(x) case Array(1,2,x,y) => println(x+" "+y) case Array(1,_*) => println("0....") case _=> throw new Exception("没有这种类型") } val list=List(1,2,3) list match{ case 1::Nil=>println("1....") case 1::x::y=>println(s"$x") case 0::tail=>println("0....") case _=>throw new Exception("匹配错误") } val t=(1,26,9) t match { case (1,2,x)=>println(s"$x") case (1,x,y)=>println(s"$x $y") case (1,_,10) =>println("....") } }
样例类
在Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的
package cn.edu.hust.cases import scala.util.Random //样例类 case class Person(name:String,age:Int) //样例类 case class life(time:Int) //样例对象 case object money object Partical extends App { val array=Array(Person("zhangsan",10),life(80),money) val t=array(Random.nextInt(array.length)) t match{ case Person(name,age) => println(s"$name $age") case life(time) => println(s"$time") case money => println(money) } }
Option类型
在Scala中Option类型样例类用来表示可能存在或也可能不存在的值(Option的子类有Some和None)。Some包装了某个值,None表示没有值。
package cn.edu.hust.option object OptionDemo extends App{ val map=Map(("a",1),("b",10)) //使用option类进行模式匹配, val m=map.get("a") match { //如果匹配的到,那么将会返回 case Some(i) => i //如果没有匹配到将会返回0 case None =>0 } println(m) //还有一个更好的方法那就是使用下列方法 val m2=map.getOrElse("c",0) println(m2) }
偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配。
package cn.edu.hust.partical class ParticalFunctionDemo { //这是一份偏函数,有PartialFunction声明,第一个参数是case里面匹配,第二个参数是返回值 def func1:PartialFunction[String,Int]={ case "one"=>1 case "two"=>2 case _ => throw new Exception("调用方法错误") } //这是一个普通的函数,里面有模式匹配 def func2(num:String):Int=num match{ case "one"=>1 case "two"=>2 case _=>throw new Exception("调用方法错误") } } object ParticalFunctionDemo extends App { val p=new ParticalFunctionDemo val result=p.func1("one") println(result) val result2=p.func2("two") println(result2) }