Scala入门系列之九--模式匹配两大法宝(match语句和case类)

传送门
Scala入门系列之一--使用命令行往文件输入数据并读取数据
Scala入门系列之二--数组、元组、列表、集合数据类型简述
Scala入门系列之三--类和方法的创建以及命令行执行scala文件
Scala入门系列之四--类成员的可见性(private)以及用value和value_=进行读取和修改
Scala入门系列之五--主构造器和辅助构造器
Scala入门系列之六--伴生对象和伴生类
Scala入门系列之七--scala中的继承
Scala入门系列之八--scala中的特质(trait),也称接口
Scala入门系列之九--模式匹配两大法宝(match语句和case类)
Scala入门系列之十--包
Scala入门系列之十一--函数式编程基础
Scala入门系列之十二--高阶函数
Scala入门系列之十三--针对容器的操作(遍历/映射/过滤/规约操作)
Scala入门系列之十四--使用IDEA编写Scala代码并Maven打包提交集群运行
传送门

一、match语句

1)可以根据关键词(或者说匹配特定的常量)去匹配相应的结果

import scala.io.StdIn._
println("Please input the score: ")
val grade = readChar()
grade match{
    case 'A' => println("85-100") 
    case 'B' => println("70-84")
    case 'C' => println("60-69")
    case '' => println("<60")
    case   _=> println("error input") // 通配符_相当于java中的default分支
}

注:
1.match结构中不需要break语句来跳出判断,Scala从前往后匹配到一个分支后,会自动跳出判断
2.case后面的表达式可以是任何类型的常量,而不要求是整数类型


2)可以通过匹配某种类型(Int/Double/String)去匹配相应的结果

for (elem <- List(6,9,0.618,"Spark","Hadoop",'Hello)){
    val str = elem match {
        case i:Int => i + "is an int value."."//匹配整型的值,并赋值给i
        case d:Double => d + " is a double value." //匹配浮点型的值
        case "Spark" => "=>"Spark is found." //匹配特定的字符串
        case s:String => s + " is a string value." //匹配其它字符串
        case _=> "unexpected value:"+ elem  //与以上都不匹配
    }
    println(str)
}

//结果
//6 is an int value.
//9 is an int value.
//0.618 is a double value.
//Spark is found.
//Hadoop is a string value.
//unexpected value:'Hello


3)除此之外,可以使用守卫式(grard)如if语句去进行一些过滤逻辑

for (elem <- List(1,2,3,4)){
    elem match{
        case if(elem % 2 == 0) => println(elem+"is even.")
        case _=> println(elem + " is odd.")
    }
}


//结果
//1 is odd.
//2 is even.
//3 is odd.
//4 is even.


二、case类

概念简述

  • case类是一种特殊的类,它们经过优化以被用于模式匹配
  • 当定义一个类时,如果在class关键字前加上case关键字,则该类称为case类
  • Scala为case类自动重载了许多实用的方法,包括toString、equals和hashcode方法
  • Scala为每一个case类自动生成一个伴生对象,其包括模板代码1个apply方法,因此,实例化case类的时候无需使用new关键字。和1个unapply方法,该方法包括一个类型为伴生类的参数返回的结果是Option类型,对应的类型参数是N元组,N是伴生类中主构造器参数的个数。Unapply方法用于对对象进行解构操作,在case类模式匹配中,该方法被自动调用,并将待匹配的对象作为参数传递给它。
//例如,假设有如下定义的一个case类:
case class Car(brand:String,price:Int)

//则编译器自动生成的伴生对象是:
object Car{
    def apply(brand:String,price:Int) = new Car(brand,price)//起实例化的作用
    
    def unapply(c:Car):Option[(String,Int)] = Some((c.brand,c.price))
}


//典例1:
case class Car(brand:String,price:Int){
    val myBYDCar = Car("BYD", 89000)
    val myBMWCar = Car("BMW", 1200000)
    val myBenzCar = Car("Benz", 1500000)
    
    for (car <- List(myBYDCar, myBMWCar, myBenzCar)){
        car match{
            case Car("BYD", 89000) => println("Hello, BYD!")
            case Car("BMW", 1200000) => println("Hello, BMW!")
            case Car(brand, price) => println(“Brand:”+ brand +“, Price:”+price+“, do you want it?”)   
        }
    }
}

//结果
//Hello, BYD!
//Hello, BMW!
//Brand:Benz, Price:1500000, do you want it?
//注:这里都是调用unapply方法获取值,然后匹配值。三个都是这样,只不过最后一个是匹配所有的值,前面是匹配特定的值



三、练习

新建一个老师类 、一个学生类、一个陌生人类。老师类学生类参数名称为姓名年龄,陌生人类没有参数。
创建一个打卡系统,如果匹配到老师,学生,就放行, 如果学生年龄小于20再额外打印一条语句,如果匹配到陌生人就不放行

case class teacher(name:String,age:Int){}
case class student(name:String,age:Int){}
case class stranger(){}

object people{
    def main(args:Array[String]){
        val t = tracher("harry",25)
        val s = student("tom",14)
        val stranger = stranger()
        
        for (a <- List(t,s,stranger)){
            a match{
                case teacher(name,age) => println("ok! Through")
                case student(name,age)if(age < 20) => println("ok! Through and This is a small friend")
                case student(name,age) => println("ok! Through and This is a big friend")
                case _=> println("fail!")
            }
        }
    }
}


你可能感兴趣的:(Scala入门系列之九--模式匹配两大法宝(match语句和case类))