Scala ------ 模式匹配和样例类(重点)

版权声明:个人原创,转载请标注! https://blog.csdn.net/Z_Date/article/details/84349231

6.1.样例类

多用于匹配模式,样例类的编写方式:

//样例类
case class LogWeb(a:Int,b:String){}

1、参数列表默认都是val修饰。除非你显示声明为var

2、样例类在使用过程中,会自动创建对象。(用于匹配模式)

3、样例类默认实现Seri序列化接口。

6.2.模式匹配

匹配模式就是更高级的Switch语句。用于匹配各个分支,匹配成功,就会执行分支后的代码。

案例:计算器,输入参数(a,b,c) 输出参数 结果

package com.zzk3
​
class Calc {
​
  def js(a:Int,b:Int,c:Char): Unit ={
    //匹配模式 match
    c match {
      case '+'=>{print("a+b="+(a+b))}
      case '-'=>{print("a-b="+(a-b))}
      case '*'=>{print("a*b="+(a*b))}
      case '/'=>{print("a/b="+(a/b))}
    }
  }
​
}
​
object Test1{
  def main(args: Array[String]): Unit = {
    val ca=new Calc
    print("请输入a:")
    var a=Console.readInt()
    print("请输入b:")
    var b=Console.readInt()
    print("请输入b:")
    var c=Console.readChar()
    ca.js(a,b,c)
  }
}

6.2.1.常量模式(constant patterns) 包含常量和常量字面量

def gzb(time:String): Unit ={
  val MONDAY="MONDAY"
  val TUE="TUE"
  val WEN="WEN"
  //匹配模式 match
  time match {
    case MONDAY=>{print("周一工作")}
    case TUE=>{print("周二工作")}
    case WEN=>{print("周二度假")}
  }
}
//匹配常量
ca.gzb("TUE")

注意:定义常量的时候一定要使用大写首字母

6.2.2.变量模式(variable patterns)

变量模式,只要不是常量或字面量就能匹配成功

//案例2 匹配常量
def gzb12(time:Any): Unit ={
  val MONDAY="MONDAY"
  //匹配模式 match
  time match {
    case "1"=>{print("周一工作")}
    case MONDAY=>{print("周二工作")}
    case a=>{print("周4度假"+a)}
  }
}
​
 ca.gzb12("sdf")

6.2.3.通配符模式(wildcard patterns)

_ : 可以匹配任意值

//案例3 通配符
def js1(a:Int,b:Int,c:Char): Unit ={
  //匹配模式 match
  c match {
    case '+'=>{print("a+b="+(a+b))}
    case '-'=>{print("a-b="+(a-b))}
    case '*'=>{print("a*b="+(a*b))}
    case '/'=>{print("a/b="+(a/b))}
    case _ =>{print("符号输入错误!")}
  }
}
    //匹配变量
    ca.js1(1,2,'c')

6.2.4.带守卫的模式

概念:通过条件控制匹配是否成功

//案例3 带守卫模式
def js2(a:Int): Unit ={
  //匹配模式 match
  a match {
    case _ if(a>12) =>{print(">12!")}
    case _ =>{print("<=12!")}
  }
}
ca.gzb("TUE")

6.2.4.样例类匹配(重点)

class Person{}
case class Student(name:String) extends  Person {}
case class Teacher(name:String) extends  Person {}
​
 //案例3 样例类匹配
  def js3(per:Person): Unit ={
    //匹配模式 match
    per match {
      case Student(name) =>{print("--->Student:"+name)}
      case Teacher(name) =>{print("--->Teacher:"+name)}
    }
  }
  
  val st=new Student("lisi")
  val teacher=new Teacher("wangwu")
  ca.js3(teacher)

 

6.2.5.类型匹配

//案例3 样例类匹配
def js4(per:Any): Unit ={
  //匹配模式 match
  per match {
    case per:String =>{print("--->String:"+per)}
    case per:Int =>{print("--->Int:"+per)}
  }
}
ca.js4(1)

6.2.6.匹配数组、列表、元组

//案例8 匹配数组元素
def gzb13(ar:Array[Int]): Unit ={
  //匹配模式 match
  ar match {
    case Array(a)=>{print("-->"+a)}
    case Array(a,b)=>{print("-->"+a+b)}
    case Array(a,b,c)=>{print("-->"+a+c+b)}
  }
}
​
//测试
var ar=Array(12)
var ar1=new Array[Int](1)
​
var ar=Array(12,13)
ca.gzb13(ar)

6.3.Option类型(map.get(key)返回Option类型)(重点)

Option选项类 ,代表两种情况,一种是有值,另外一种是null

有值的时候返回Some容器,没有值的时候返回None

如果返回Some,可以使用get方法取值

判断是否为空使用isEmpty

val map=Map("010"->"bj","020"->"sh","022"->"tj")
val m1: Option[String] = map.get("010")
//print(m1.get)
print(m1.isEmpty)

6.4.偏函数 (PartialFunction[A, B])

偏函数案例

def f:PartialFunction[String,Int]={
  case "one" =>{ 1 }
  case "two" =>{ 2 }
  case "three" =>{ 3 }
}
//测试
val i: Int = f("two")
print(i)

注意:两个参数 一个是传入值的类型,后者是返回值的类型

6.5.String 字符串插值**(INTERPOLATION)(了解)

val name="zhangsan"
print(s"----${name}----->")

猜你喜欢

转载自blog.csdn.net/Z_Date/article/details/84349231