简介
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)
}