Scala中模式匹配

Scala中模式匹配

模式匹配类似于java中switch case,但是scala中的模式匹配功能远强于java中的switch

基本语法

val oper = 'o'
val n1 = 20
val n2 = 10
var res = 0
/**
  * 如果匹配成功,则执行 => 后面的代码
  * 匹配的顺序是从上到下,匹配到一个就行执行对应的代码
  * => 后面的代码块,不需要些break,会自动退出match
  * 如果一个都没有匹配到,则执行case _后面的代码块
  */
oper match {
	case '+' => res = n1 + n2
	case '-' => res = n1 - n2
	case '*' => n1 * n2
	case '/' => n1 / n2
	//if后面称为条件守卫
	case _ if(oper == 'o') => println("oper is o")
	case _ => println("oper error")
}

类型匹配

Map[String,Int]与Map[Int,String]是两种不同的类型
//在类型匹配之前编译器会先预先检测是否有可能匹配,如果没有则报错
//如果这里不使用:Any的话,下面就有可能会报错
val obj: Any = "xxx"
val result = obj match {
	//a的意思是先把obj赋值给a,然后再匹配类型
	case a: Int => println("Int类型")
	case b: String => println("String类型")
	case c: Map[String,Int]	=> println("Sting-Int类型")
	case _ => println("傻逼")
}

Array匹配

def arrayMatch(arr: Any) =  arr match {
	case Array(0) => println("只有一个0元素的数组")
	case Array(0,_) => println("以0开头的,拥有2个元素的数组")
	case Array(0,_,3) => println("以1开头,3结尾,中间为任意元素的三个元素的数组")
	case Array(8,_*) => println("以8开头的,任意个元素的数组")
	case Array(_,_) => println("数组种有两个元素")
	//匹配数组种有三个元素,将数组中的元素赋值给x,y,z然后我们就可以做顺序的变换了
	case Array(x,y,z) => Array(z,x,y)
}

List匹配

def listMath(list: Any) = list match {
	case 0 :: Nil => println("只有一个元素0元素的list")
	case 7 :: 9 :: Nil => println("只有7和9的元素的list")
	case x::y::z::Nil => println("只有三个元素的list")
	case m :: n if n.length>0 => println("拥有头和尾的列表")
	case _ => println("匹配不成功")
}

对象匹配

//怎样才能算是对象匹配上呢?
//case种对象的unapply方法(对象提取器)返回Some集合则为匹配成功,返回none集合则为匹配失败
object Demo03 {
	def main(args: Array[String]): Unit = {
		val num: Double = 36.0
		num match {
			//当匹配到Square(n),就调用Square的unapply方法
			//如果对象提取器unapply(z: Double)返回值some(6),则匹配成功,并同时把6赋值给n
			//如果返回的是None,则表示匹配不成功
			case Square(n) => println(n)
			case _ => println("匹配失败")
		}
		val names = "xxx"
		names match {
			//当case后面的对象提取器方法的参数为多个时,则会默认调用def unapplySeq方法
			//如果返回对应unapplySeq返回的some
			case Name(a,b,x) => println(a,b,x)
			case _ => println("傻逼")
		}
	}
}
object Square {
	def apply(z: Double): Double = z * z
	//unapply方法是对象提取器
	//接收z: Double类型
	//返回类型Option[Double]
	def unapply(z: Double): Option[Double] = Some(math.sqrt(z))
}
object Name {
	def unapplySeq(str: String): Option[Seq[String]] = {
		println("xxxxxxxxxxx")
		Some(Array("aa","bb","cc"))
	}
}
posted @ 2019-02-26 11:15  刘丽刚  阅读(187)  评论(0)    收藏  举报