2021-05-17

匹配

模式匹配基本语法

模式匹配
函数编程语言的标配
有点类似java的switch
基本使用:
要匹配的值 match{
case 选项=》
// 代码
case 选项=》
//代码

package com.syf.scala1015day06

import scala.io.StdIn

/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo1 {
  def main(args: Array[String]): Unit = {
    val a:Int=10
    val b:Int=20
    val op:String =StdIn.readLine("请输入一个运算符:")
    op match{
      case "+"=>
        println(a + b)
      case "-"=>
        println(a - b)
      case "*"=>
        println(a * b)
      case "/"=>
        println(a / b)
      case _=>
        println("你的运算符输入的不对")

    }
  }
}

匹配变量和常量

匹配变量
case aa
aa是新声明的,只能在这个case内使用
case Ba
变量是大写字母开头,Scala认为这个变量是一个常量,必须是已经定义好的常量
匹配常量:
1.首字母大写
2.aA
case _
本质就是匹配变量,只是把变量名字省略了

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo2 {
  def main(args: Array[String]): Unit = {
//    val a:Int=20
//    a match {
//        //case语句类新声明的变量
//      case aa=> println(aa)
//      case 20=> println(20)
//    }
val a:Int=20
    val aA:Int=20
       a match {
         case a=> println(a)
         case `aA`=> println(aA)
       }
  }
}

模式匹配的值

任何的语法结构都有值!
模式匹配也有值,他的值就是匹配成功的那个case的最后一行代码的值

package com.syf.scala1015day06

import scala.io.StdIn

/**
* Author Amily
* Date 2021/5/17
*/
object PatternDemo3 {
  def main(args: Array[String]): Unit = {
    val a:Int=10
    val b:Int=20
    val op:String =StdIn.readLine("请输入一个运算符:")
    val r:Int=op match{
      case "+"=>
        a + b
      case "-"=>
        a - b
      case "*"=>
        a * b
      case "/"=>
        a / b
      case _=>
        -1

    }
    println(r)
  }
}

守卫和匹配类型

基本使用
匹配变量和常量
区别
模式匹配的值
匹配类型:

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo4 {
  def main(args: Array[String]): Unit = {
    val a:Any=10
    a match {
      case a :Int if a>10=> println(a + 10)
      case s:String=> println(s.toUpperCase())
      case b:Boolean=> println(b)
      case _=>
    }
  }
}

泛型的类型匹配

new int[] new String[]
数组在是Scala中表面用到了泛型,实际不是泛型
除了数组其他的所有泛型都是真正的泛型
泛型模式的匹配是无法匹配出泛型的类型的
泛型擦除:
泛型的存在是为了在编译的时候类型更安全
泛型值存在于源码和编译的时候,编译成字节码之后,泛型就不存在了

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo5 {
  def main(args: Array[String]): Unit = {
//    val arr:Array[Int]=Array[Int](1,2)
    val arr:Any=List[Double](1.1,2,3)
    arr match {
//      case a:Array[Int]=> println("Array[Int]")
//      case a:Array[Double]=> println("Array[Double]")
        //匹配任意数组
//      case a:Array[_]=> println("Array[Double]")
//      case a:List[Int]=> println("List[Int]")
      case a:List[_]=> println("List[_]")
    }
  }
}

匹配数组

模式匹配深入到集合的内部:
有顺序的集合

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo6 {
  def main(args: Array[String]): Unit = {
    val arr :Array[Int]=Array(2,2,3,4)
    arr match {
      case Array(1,2,a,b)=>
//        println("Array(1,2,_,_)")
//        println("Array(1,2,a,b)")
//        println(a, b)
//      case Array(2,2,_*)=>
//        println("Array(2,2,_*)")
      case Array(2,2,abc@_*)=>
        println(abc.toList)
    }
  }
}

元素匹配

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo7 {
  def main(args: Array[String]): Unit = {
    val t:(String,Int)=("lisi",20)
    t match {
//      case (name,age)=> println(name)
      case (name:String,age)=> println(name)
    }
  }
}

List匹配

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object PatternDemo8 {
  def main(args: Array[String]): Unit = {
     val list :List[Int]=List(10,20,30,40)
    list match {
//      case List(a,b,c,d)=>
//        println("List(a,b,$c,$d)")
//      case List(10,abc@_*)=>
//        println(abc)
//      case a::b::c::d::Nil=>
//        println(a)
//      case a::rest=>
//        println(rest)
      case a::b::c=>
        //最后一个一定是集合
        println(a)
        println(b)
        println(c)
    }
  }
}

Option的使用

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object OptionDemo1 {
  def main(args: Array[String]): Unit = {
//    val op:Option[Int]=get
//    if(op.isDefined){
//      println(op.get)
//    }
    val op:Option[Double]=sqrt(-9)
    if (op.isDefined) {
      println(op.get)
    }else{
      println("没有平方根")
    }
  }
  def sqrt(n:Double)={
    if(n>=0) Some(math.sqrt(n))
    else None
  }
 def get:Option[Int]= Some(10)
}

模式匹配中的对象匹配

case Person(age,name)=>
会去调用People 伴生对象的unapply

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
class People(val age:Int,val name:String)
object People{
  def unapply(pp:People):Option[(Int,String)]=if(pp!=null){
    Some(pp.age,pp.name)
  }else{
    None
  }
}
object ObjMatch {
  def main(args: Array[String]): Unit = {
    val p:People=new People(10,"zhiling")
    p match {
      case People(age,name)=> println(age,name)
      case _ =>


    }
  }
}

对象匹配的案例

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object Sqrt {
  def unapply(d:Double) :Option[Double] =
    if (d>0)Some(math.sqrt(d))
    else None

}
object ObjMatch1 {
  def main(args: Array[String]): Unit = {
    //使用对象匹配的方式把一个数的平方根匹配出来
    val d:Double=9
    d match {
      case Sqrt(a)=> println(a)
    }
  }
}
/*

 */

匹配序列

对象匹配的基本原理:
对象的unapply或unapplySeq

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
object MyArray{
  def unapplySeq(s:String)=
    if(s!=null)
      Some(s.split(",").toList)
    else None

}
object ObjMatch2 {
  def main(args: Array[String]): Unit = {
    val names:String ="lisi,zhangsan,wangwu,zhiling,fengjie"
    names match{
      case MyArray(a,b,rest@_*)=>
        println(a)
        println(b)
        println(rest)
    }
  }
}

样例类

package com.syf.scala1015day06
/**
  * Author Amily
  * Date 2021/5/17
  */
case class  User(age:Int,name:String)
object CaseDemo1 {
  def main(args: Array[String]): Unit = {
    val user:User=User(10,"lisi")
    user match {
      case User(age,name)=> println(age)
    }
  }
}
/*
样例类:
  apply
  unapply
  equals
  hashCode
    ....
 判断数据:
     通讯协调
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值