基础语法

/*
模式匹配的语法:
变量 match {
case 匹配条件 => {
….
}
case 匹配条件 => {

}
….
case x => xx // 类似java withch的default,也可以写成:case _ => xx
}
模式匹配中如果条件匹配上之后会执行=>后面的内容,执行完成之后自动退出,不会继续执行后续的case条件
模式匹配有返回值的,返回值是满足条件的分支的块表达式的结果值
/

  1. package tcode.chapter08
  2. import scala.io.StdIn
  3. object $01_MatchDefined {
  4. def main(args: Array[String]): Unit = {
  5. val line = StdIn.readLine("请输入一个单词:")
  6. val r = line match {
  7. case "hadoop" =>
  8. var a = 10
  9. var b = 20
  10. var c = a+b
  11. println("输入是hadoop")
  12. 10
  13. case "spark" =>{
  14. println("输入是spark")
  15. 20
  16. }
  17. case "flume"=>{
  18. println("输入是flume")
  19. 30
  20. }
  21. //case x => println(s"其他...${x}")
  22. //如果x在右边没有使用可以用_代替
  23. //相当于java switch的default
  24. case _ =>
  25. println(s"其他...")
  26. 40
  27. }
  28. println(r)
  29. }
  30. }

模式守卫

  1. package tcode.chapter08
  2. import scala.io.StdIn
  3. object $02_MatchIf {
  4. /**
  5. * 模式匹配守卫语法:
  6. * 变量 match {
  7. * case 条件 if(布尔表达式) => {...}
  8. * case 条件 if(布尔表达式) => {...}
  9. * case 条件 if(布尔表达式) => {...}
  10. * }
  11. * 模式匹配守卫必须满足条件以及if判断语句才算匹配上
  12. */
  13. def main(args: Array[String]): Unit = {
  14. val line = StdIn.readLine("请输入一句话:")
  15. line match {
  16. case x if(x.contains("spark")) => println("句子中包含spark")
  17. case x if(x.contains("hadoop")) => println("句子中包含hadoop")
  18. case x if(x.contains("hello")) => println("句子中包含hello")
  19. case x => println("其他情况...") // 类似java withch的default
  20. }
  21. }
  22. }

模式匹配类型

模式匹配值

模式匹配在匹配值的时候,如果匹配条件是要使用外部变量的值,此时变量名必须首字母大写

  1. package tcode.chapter08
  2. import scala.io.StdIn
  3. import scala.util.Random
  4. object $03_MatchValue {
  5. //模式匹配在匹配值的时候,如果匹配条件是要使用外部变量的值,此时变量名必须首字母大写
  6. def main(args: Array[String]): Unit = {
  7. val arr = Array("hello",2.0,false,10,"hadoop")
  8. val index = Random.nextInt( arr.size )
  9. val data = arr(index)
  10. println(data)
  11. val Wc = "hadoop"
  12. data match {
  13. case Wc => println("hadooop............")
  14. case "hello" => println("hello............")
  15. case 2.0 => println("2.0............")
  16. case false => println("false............")
  17. case x => println("其他情况............")
  18. }
  19. }
  20. }

模式匹配类型

  1. package tcode.chapter08
  2. import scala.util.Random
  3. object $04_MatchType {
  4. class Person(val name:String,var age:Int)
  5. /**
  6. * 匹配类型:
  7. * 变量 match {
  8. * case x:类型1 => ..
  9. * case x:类型2 => ..
  10. * }
  11. */
  12. def main(args: Array[String]): Unit = {
  13. val arr = Array("hello",2.0,false,10,"hadoop",new Person("lisi",30),new Person("wangwu",20))
  14. val index = Random.nextInt( arr.size )
  15. val data = arr(index)
  16. println(data)
  17. data match{
  18. case x:String => println("数据是字符串")
  19. case x:Int => println("数据是Int")
  20. case x:Double => println("数据是Double")
  21. case x:Boolean => println("数据是Boolean")
  22. case x:Person if(x.name=="lisi")=> println("数据是Person lisi")
  23. case x:Person if(x.name=="wangwu")=> println("数据是Person wangwu")
  24. }
  25. }
  26. }

模式匹配数组

  1. package tcode.chapter08
  2. object $05_MatchArray {
  3. def main(args: Array[String]): Unit = {
  4. val arr = Array[Int](1,2,3)
  5. arr match {
  6. case Array(x) => println("匹配数组只有一个元素")
  7. case Array(_:Int,_:Int,_:Int) => println("匹配数组有三个元素") // x,y,z如果在右边不使用可以用_简化
  8. case Array(x,y,z,_*) => println("匹配数组至少有三个元素")
  9. }
  10. }
  11. }

模式匹配list

  1. package tcode.chapter08
  2. object $06_MatchList {
  3. def main(args: Array[String]): Unit = {
  4. val arr = List[Int](1,2,3)
  5. // 第一种方式
  6. arr match {
  7. case List(x) => println("匹配List只有一个元素")
  8. case List(x:Int,_*) => println("匹配List至少有一个元素") // x,y,z如果在右边不使用可以用_简化
  9. case List(_,y,_) => println("匹配List有三个元素")
  10. }
  11. // 第二种方式
  12. arr match {
  13. case x :: Nil => println("匹配List只有一个元素")
  14. case (x:Int) :: y :: tail => println(s"匹配List至少有一个元素 ${x} ${y} ${tail}")
  15. case x :: y :: z :: Nil => println("匹配List有三个元素")
  16. }
  17. }
  18. }

模式匹配元祖

  1. package tcode.chapter08
  2. object $07_MatchTuple {
  3. //匹配元组的时候,变量是几元元组那么匹配条件就应该是几元元组
  4. def main(args: Array[String]): Unit = {
  5. val t1:(Any,Any,Any) = ("zhangsan",20,"shenzhen")
  6. t1 match{
  7. case (name:String,age,address) => println(s"${name} ${age} ${address}")
  8. }
  9. // 嵌套
  10. val ts = List[(String,(String,(String,(String,Int))))](
  11. ("宝安区",("宝安中学",("大数据班",("zhangsan",20)))),
  12. ("宝安区",("宝安中学",("大数据班",("wangwu",20)))),
  13. ("宝安区",("宝安中学",("大数据班",("zhaoliu",20))))
  14. )
  15. ts.foreach(x=> {
  16. x match {
  17. case (regionName,(schoolName,(className,(stuName,age)))) => println(stuName)
  18. }
  19. })
  20. }
  21. }

匹配样例类

/*
样例类语法: case class 类名([val/var] 属性名:类型)
1)样例类,自动生成了伴生对象,并且伴生对象中自动提供了一些常用的方法,
如apply、unapply、toString、equals、hashCode和copy。
2)样例类是为模式匹配而优化的类,因为其默认提供了unapply方法,
因此,样例类可以直接使用模式匹配,而无需自己实现unapply方法。
3)创建样例类对象: 样例类类名(属性值,..)
4)样例类属性如果不用val/var修饰,默认就是val修饰

*/

  1. package tcode.chapter08
  2. object $08_MatchClass {
  3. case class Person(val name:String ,var age:Int, address:String)
  4. def main(args: Array[String]): Unit = {
  5. val person = Person("zhangsan",20,"beijing")
  6. val student = Student("zhangsan",20,"beijing")
  7. println(person.name)
  8. println(person.age)
  9. println(person.address)
  10. person match {
  11. case Person(x,y,z) => println(s"x=${x} y=${y} z=${z}")
  12. }
  13. student match{
  14. case Student(x,y,z) => println(s"x=${x} y=${y} z=${z}")
  15. }
  16. }
  17. }
  18. class Student(val name:String ,var age:Int, val address:String)
  19. // 伴生对象
  20. object Student{
  21. def apply(name: String, age: Int, address: String): Student = new Student(name, age, address)
  22. def unapply(arg: Student): Option[(String, Int, String)] = {
  23. if(arg==null)
  24. None
  25. else
  26. Some((arg.name,arg.age,arg.address))
  27. }
  28. }

变量声明中的模式匹配

for循环的模式匹配

  1. package tcode.chapter08
  2. object $09_MatchParamDefined {
  3. def main(args: Array[String]): Unit = {
  4. val t = ("zhangsan",20,"shenzhen")
  5. ---------------元祖
  6. println(t._1)
  7. val (name,age,address) = ("zhangsan",20,"shenzhen")
  8. println(name)
  9. println(age)
  10. println(address)
  11. ---------------数组
  12. val Array(x,_) = Array(10,2)
  13. val y :: Nil = List(10)
  14. println(y)
  15. ----------------for循环
  16. val map = Map[String,Int]("aa"->10,"bb"->20)
  17. for((key,value) <- map){
  18. println(key)
  19. println(value)
  20. }
  21. ------------
  22. }
  23. }

偏函数中的模式匹配

偏函数不需要x=>!!!

  1. package tcode.chapter08
  2. import scala.util.Random
  3. object $10_PartialFunction {
  4. /**
  5. * 偏函数: 没有match关键字的模式匹配称之为偏函数
  6. * 语法:
  7. * val 函数名:PartialFunction[IN,OUT] = {
  8. * case 条件 => ...
  9. * case 条件 => ...
  10. * case 条件 => ...
  11. * }
  12. * IN: 代表函数的参数类型
  13. * OUT: 代表函数返回值类型
  14. *
  15. */
  16. def main(args: Array[String]): Unit = {
  17. val arr = Array("hello",10.0,22,false)
  18. val data = arr(Random.nextInt(arr.length))
  19. println(data)
  20. /* val func:String=>Unit = (x:String) => {
  21. case "hello" => println(".....")
  22. case "lisi" => println("+++++++")
  23. case _ => println("-------------")
  24. }*/
  25. val func:PartialFunction[Any,Unit] = {
  26. case "hello" => println("hello.......")
  27. case 10.0 => println("10.0.......")
  28. case 22 => println("22.......")
  29. case false => println("false.......")
  30. }
  31. func(data)
  32. val ts = List[(String,(String,(String,(String,Int))))](
  33. ("宝安区",("宝安中学",("大数据班",("zhangsan",20)))),
  34. ("宝安区",("宝安中学",("大数据班",("wangwu",20)))),
  35. ("宝安区",("宝安中学",("大数据班",("zhaoliu",20))))
  36. )
  37. val func2:PartialFunction[(String,(String,(String,(String,Int)))),(String,String)] = {
  38. case (regionName,(schoolName,(className,(stuName,age)))) => (schoolName,className)
  39. }
  40. ts.map(func2).foreach(x=>println(x))
  41. // 工作中的应用:
  42. //直接传递函数值
  43. ts.map{
  44. case (regionName,(schoolName,(className,(stuName,age)))) => (schoolName,stuName)
  45. }.foreach{
  46. case (schoolName,stuName) => println(stuName)
  47. }
  48. }
  49. }