基础语法
/*
模式匹配的语法:
变量 match {
case 匹配条件 => {
….
}
case 匹配条件 => {
…
}
….
case x => xx // 类似java withch的default,也可以写成:case _ => xx
}
模式匹配中如果条件匹配上之后会执行=>后面的内容,执行完成之后自动退出,不会继续执行后续的case条件
模式匹配有返回值的,返回值是满足条件的分支的块表达式的结果值
/
package tcode.chapter08import scala.io.StdInobject $01_MatchDefined {def main(args: Array[String]): Unit = {val line = StdIn.readLine("请输入一个单词:")val r = line match {case "hadoop" =>var a = 10var b = 20var c = a+bprintln("输入是hadoop")10case "spark" =>{println("输入是spark")20}case "flume"=>{println("输入是flume")30}//case x => println(s"其他...${x}")//如果x在右边没有使用可以用_代替//相当于java switch的defaultcase _ =>println(s"其他...")40}println(r)}}
模式守卫
package tcode.chapter08import scala.io.StdInobject $02_MatchIf {/*** 模式匹配守卫语法:* 变量 match {* case 条件 if(布尔表达式) => {...}* case 条件 if(布尔表达式) => {...}* case 条件 if(布尔表达式) => {...}* }* 模式匹配守卫必须满足条件以及if判断语句才算匹配上*/def main(args: Array[String]): Unit = {val line = StdIn.readLine("请输入一句话:")line match {case x if(x.contains("spark")) => println("句子中包含spark")case x if(x.contains("hadoop")) => println("句子中包含hadoop")case x if(x.contains("hello")) => println("句子中包含hello")case x => println("其他情况...") // 类似java withch的default}}}
模式匹配类型
模式匹配值
模式匹配在匹配值的时候,如果匹配条件是要使用外部变量的值,此时变量名必须首字母大写
package tcode.chapter08import scala.io.StdInimport scala.util.Randomobject $03_MatchValue {//模式匹配在匹配值的时候,如果匹配条件是要使用外部变量的值,此时变量名必须首字母大写def main(args: Array[String]): Unit = {val arr = Array("hello",2.0,false,10,"hadoop")val index = Random.nextInt( arr.size )val data = arr(index)println(data)val Wc = "hadoop"data match {case Wc => println("hadooop............")case "hello" => println("hello............")case 2.0 => println("2.0............")case false => println("false............")case x => println("其他情况............")}}}
模式匹配类型
package tcode.chapter08import scala.util.Randomobject $04_MatchType {class Person(val name:String,var age:Int)/*** 匹配类型:* 变量 match {* case x:类型1 => ..* case x:类型2 => ..* }*/def main(args: Array[String]): Unit = {val arr = Array("hello",2.0,false,10,"hadoop",new Person("lisi",30),new Person("wangwu",20))val index = Random.nextInt( arr.size )val data = arr(index)println(data)data match{case x:String => println("数据是字符串")case x:Int => println("数据是Int")case x:Double => println("数据是Double")case x:Boolean => println("数据是Boolean")case x:Person if(x.name=="lisi")=> println("数据是Person lisi")case x:Person if(x.name=="wangwu")=> println("数据是Person wangwu")}}}
模式匹配数组
package tcode.chapter08object $05_MatchArray {def main(args: Array[String]): Unit = {val arr = Array[Int](1,2,3)arr match {case Array(x) => println("匹配数组只有一个元素")case Array(_:Int,_:Int,_:Int) => println("匹配数组有三个元素") // x,y,z如果在右边不使用可以用_简化case Array(x,y,z,_*) => println("匹配数组至少有三个元素")}}}
模式匹配list
package tcode.chapter08object $06_MatchList {def main(args: Array[String]): Unit = {val arr = List[Int](1,2,3)// 第一种方式arr match {case List(x) => println("匹配List只有一个元素")case List(x:Int,_*) => println("匹配List至少有一个元素") // x,y,z如果在右边不使用可以用_简化case List(_,y,_) => println("匹配List有三个元素")}// 第二种方式arr match {case x :: Nil => println("匹配List只有一个元素")case (x:Int) :: y :: tail => println(s"匹配List至少有一个元素 ${x} ${y} ${tail}")case x :: y :: z :: Nil => println("匹配List有三个元素")}}}
模式匹配元祖
package tcode.chapter08object $07_MatchTuple {//匹配元组的时候,变量是几元元组那么匹配条件就应该是几元元组def main(args: Array[String]): Unit = {val t1:(Any,Any,Any) = ("zhangsan",20,"shenzhen")t1 match{case (name:String,age,address) => println(s"${name} ${age} ${address}")}// 嵌套val ts = List[(String,(String,(String,(String,Int))))](("宝安区",("宝安中学",("大数据班",("zhangsan",20)))),("宝安区",("宝安中学",("大数据班",("wangwu",20)))),("宝安区",("宝安中学",("大数据班",("zhaoliu",20)))))ts.foreach(x=> {x match {case (regionName,(schoolName,(className,(stuName,age)))) => println(stuName)}})}}
匹配样例类
/*
样例类语法: case class 类名([val/var] 属性名:类型)
1)样例类,自动生成了伴生对象,并且伴生对象中自动提供了一些常用的方法,
如apply、unapply、toString、equals、hashCode和copy。
2)样例类是为模式匹配而优化的类,因为其默认提供了unapply方法,
因此,样例类可以直接使用模式匹配,而无需自己实现unapply方法。
3)创建样例类对象: 样例类类名(属性值,..)
4)样例类属性如果不用val/var修饰,默认就是val修饰
*/
package tcode.chapter08object $08_MatchClass {case class Person(val name:String ,var age:Int, address:String)def main(args: Array[String]): Unit = {val person = Person("zhangsan",20,"beijing")val student = Student("zhangsan",20,"beijing")println(person.name)println(person.age)println(person.address)person match {case Person(x,y,z) => println(s"x=${x} y=${y} z=${z}")}student match{case Student(x,y,z) => println(s"x=${x} y=${y} z=${z}")}}}class Student(val name:String ,var age:Int, val address:String)// 伴生对象object Student{def apply(name: String, age: Int, address: String): Student = new Student(name, age, address)def unapply(arg: Student): Option[(String, Int, String)] = {if(arg==null)NoneelseSome((arg.name,arg.age,arg.address))}}
变量声明中的模式匹配
for循环的模式匹配
package tcode.chapter08object $09_MatchParamDefined {def main(args: Array[String]): Unit = {val t = ("zhangsan",20,"shenzhen")---------------元祖println(t._1)val (name,age,address) = ("zhangsan",20,"shenzhen")println(name)println(age)println(address)---------------数组val Array(x,_) = Array(10,2)val y :: Nil = List(10)println(y)----------------for循环val map = Map[String,Int]("aa"->10,"bb"->20)for((key,value) <- map){println(key)println(value)}------------}}
偏函数中的模式匹配
偏函数不需要x=>!!!
package tcode.chapter08import scala.util.Randomobject $10_PartialFunction {/*** 偏函数: 没有match关键字的模式匹配称之为偏函数* 语法:* val 函数名:PartialFunction[IN,OUT] = {* case 条件 => ...* case 条件 => ...* case 条件 => ...* }* IN: 代表函数的参数类型* OUT: 代表函数返回值类型**/def main(args: Array[String]): Unit = {val arr = Array("hello",10.0,22,false)val data = arr(Random.nextInt(arr.length))println(data)/* val func:String=>Unit = (x:String) => {case "hello" => println(".....")case "lisi" => println("+++++++")case _ => println("-------------")}*/val func:PartialFunction[Any,Unit] = {case "hello" => println("hello.......")case 10.0 => println("10.0.......")case 22 => println("22.......")case false => println("false.......")}func(data)val ts = List[(String,(String,(String,(String,Int))))](("宝安区",("宝安中学",("大数据班",("zhangsan",20)))),("宝安区",("宝安中学",("大数据班",("wangwu",20)))),("宝安区",("宝安中学",("大数据班",("zhaoliu",20)))))val func2:PartialFunction[(String,(String,(String,(String,Int)))),(String,String)] = {case (regionName,(schoolName,(className,(stuName,age)))) => (schoolName,className)}ts.map(func2).foreach(x=>println(x))// 工作中的应用://直接传递函数值ts.map{case (regionName,(schoolName,(className,(stuName,age)))) => (schoolName,stuName)}.foreach{case (schoolName,stuName) => println(stuName)}}}
