scala匹配模式、样例类【基本匹配模式、模式守卫、类型匹配】

一、scala匹配模式

scala有三种匹配模式

  1. 基本模式匹配
  2. 模式守卫
  3. 类型匹配

注:匹配模式是从上往下匹配的,在后面的匹配中可能case之间调换位置,匹配结果就不一样。

基本模式匹配

传入什么基本就对相应元素元素进行匹配,输出匹配上的元素相应的输出。
案例演示:

def matchTest(x:Int):String=x match {
      case 1 => "one"
      case 2 => "two"
      case 3 => "three"
      case _ => "many"
    }

    println(matchTest(3))
    println(matchTest(2))
    println(matchTest(8))
  }

模式守卫

对于一般基本匹配模式,传入的x只能值一个值进行匹配,匹配上就输出相应的值。但是x只能一个一个值进行匹配,并不能匹配一个范围。但是在模式守卫中可以添加if条件,进行匹配的守卫,同时也可以圈定匹配范围。
案例演示:

def matchTest2(x:Int):String= x match {
      case i if i==100 => "满分大神"
      case i if i>=90 && i<100 =>"相当优秀"
      case i if i>=80 && i<90 => "良好"
      case i if i>=70 && i<80 => "一般"
      case i if i>=60 && i<70 => "及格"
      case i if i>=0 && i<60 => "不及格"
      case _ => "成绩不合法"
    }

    println(matchTest2(20))

类型匹配

scala匹配模式中也可以匹配传来数据的类型,判断数据类型匹配成功则输出相应值。
案例演示:

def matchTest03(x:Any):String = x match {
      case x:Int => "this is Int"
      case x:String => "this is String"
      case _ => "this is not Int and String"
    }

    println(matchTest03(2))
  }

二、样例类

样例类是在scala中经常用在模式匹配中,当一个类被定义成为case类后,Scala会自动帮你创建一个伴生对象并帮你实现了一系列方法且带来了不少好处。

样例类的定义

//定义一个样例类
    case class Students(name:String,age:Int)

三、对样例类进行模式匹配

def matchTest04(x:Students)=x match {
      case Students(name, age) => println(age)
      case Students(name, 19) => println(name)
      case Students("zs", age) => println(age)
      case _ => println("no matches")
    }
    //调用
    val stu1 = Students("zs",19)
    matchTest04(stu1)
    matchTest04(Students("Tom",15))

四、普通类的模式匹配

普通类要想进行模式匹配,需要创建对象,需要自己创建半生类,创建半生对象。使用unapply方法。才能进行模式匹配。
案例演示:

object MatchDemo01 {
  def main(args: Array[String]): Unit = {
    //非样例类的模式匹配,需要使用半生对象实现unplay方法
    def matchTest05(x:Student)=x match {
      case Student(name,age) if age<20 => println("young")
      case Student(name,age) if age>30 => println("old")
    }

    matchTest05(Student("zhangsan",18))
    matchTest05(Student("lisi",35))
  }
}

//定义一个普通的类
class Student(n:String,a:Int){
  //定义一下成员变量
  var name:String=n
  var age:Int=a
}

object Student{
  def apply(n: String, a: Int): Student = new Student(n, a)

  def unapply(arg: Student): Option[(String, Int)] = {
    //实现提取器的逻辑代码
    if(arg==null) None else Some(arg.name,arg.age)
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值