scala基础-模式匹配

Scala是没有Java中的switch case语法的,相对应的,Scala提供了更加强大的match case语法,即模式匹配
Scala的match case与Java的switch case最大的不同点在于,Java的switch case仅能匹配变量的值,比1、2、3等;而Scala的match case可以匹配各种情况,比如变量的类型、集合的元素、有值或无值。
scala模式匹配只要匹配到一种情况就不再继续,不需要break来跳出case。

1、具体值的模式匹配

模式匹配是可以加入if守卫进行条件判断

scala> def someThingFilter(data : String, age: Int){
     | data match{
     | case "A" => println("A")
     | case "B" if age > 18 => println("B")
     | case "B" if age <= 18 => println("B and age is : " + age)
     | case _ if age > 18 => println("teenager")
     | case _ => println(data + "  " + age)
     | }
     | }
someThingFilter: (data: String, age: Int)Unit
// case 中可以进行条件判断

scala> someThingFilter("B", 18)
B and age is : 18

scala> someThingFilter("A", 18)
A

scala> someThingFilter("c", 18)
c  18

scala> someThingFilter("c", 17)
c  17

scala> someThingFilter("c", 19)
teenager

同时匹配的时候可以定义变量将data传入到dataA,并可以调用dataA

scala> def someThingFilter(data : String, age: Int){
     |       data match{
     |       case "A" => println("A")
     |       case "B" if age > 18 => println("B")
     |       case "B" if age <= 18 => println("B and age is : " + age)
     |       case dataA if dataA == "C" || age > 18 => println("teenager" + "  "
 + dataA)
     | case _ => println("Unknown")
     | }
     | }
someThingFilter: (data: String, age: Int)Unit

scala> someThingFilter("C", 19)
teenager  C

2、类型的模式匹配

object ProTest2 {
  def main(args: Array[String]): Unit = {
    def animalJudge(a : Animal){
      a match{
        case c: Cat => {println("It's a cat"); c.eat}
        case d: Dog => println("It's a dog"); d.eat
        case _ => println("Unknown! ")
      }
    }
    val dog = new Dog()
    animalJudge(new Cat())
    animalJudge(new Dog())
    animalJudge(dog)

  }
}

abstract class Animal{
  def eat
}

class Cat extends Animal{
  override def eat{
    println("Fish !")
    }
}

class Dog extends Animal{
  override def eat{
    println("Bone !")
  }
}

对数组进行模式匹配:

object ProTest2 {
  def main(args: Array[String]): Unit = {
    def arrayJudge(array : Array[String]){
      array match{
        // 具体值完全匹配
        case Array("Jerry", "Tom") => println("Tom is Jerry's friend!")
        // 数组值个数匹配
        case Array(name1, name2, name3) => println("The length of arry is " + array.length)
        // 匹配某个值开头
        case Array("Jerry", _*) => println("array start with Jerry")
        case _ => println("Unknown!") 
      }
    }   
    arrayJudge(Array("Jerry", "Tom"))
    arrayJudge(Array("Jerry", "Tom", "Bob"))
    arrayJudge(Array("Tom", "Bob"))

  }
}
Tom is Jerry's friend!
The length of arry is 3
Unknown!

3 case class 模式匹配(样式类)

// 定义一个Person类
scala> class Person
defined class Person
// case class定义一个Student继承Person类
scala> case class Student(name: String, socore: Int) extends Person
defined class Student
// case class定义一个Teacher继承Person类
scala> case class Teacher(name: String, subject: String) extends Person
defined class Teacher
// 模式匹配
scala> def content(person: Person){
     | person match{
     | case Student(name, score) => println("name is " + name + " , score = " +
score)
     | case Teacher(name, subject) => println(name + " teacher " + subject)
     | case _ => println("Unknown")
     | }
     | }
content: (person: Person)Unit

scala> content(Student("Jerry", 33))
name is Jerry , score = 33

scala> content(Teacher("Tom", "math"))
Tom teacher math

4、Option与模式匹配

object ProTest2 {
  def main(args: Array[String]): Unit = {
    val student = Map("Jerry" -> 12, "Tom" -> 33, "Bob" -> 2)

    def idIsExist(name : String){
      val isExist = student.get(name)
      isExist match{
        // 具体值完全匹配
        case Some(isExist) => println(name + " is my student !")
        // 数组值个数匹配
        case None => println("Sorry !")

      }
    }   
   idIsExist("Jerry")
   idIsExist("Marry")

  }
}

输出:

Jerry is my student !
Sorry !
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值