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}----->")