scala的模式匹配
package com.meng.nan.day715
import scala.util.Random
//模式匹配
object PatternMatching extends App {
val array=Array("xaioming","xiaohua","xiaohei")
val name=array(Random.nextInt(array.length))
name match {
case "xiaoming"=>println("小明")
case "xiaohua"=>println("小华")
case "xiaohei"=>println("小黑")
case _=>print("??????")
}}
当一个类被声名为 case class 的时候,scala 会帮助我们做下面几件事情:
1、构造器中的参数如果不被声明为 var 的话,它默认的话是 val 类型的,但一般不推荐将
构造器中的参数声明为 var
2、自动创建伴生对象,同时在里面给我们实现子 apply 方法,使得我们在使用的时候可以
不直接显示地 new 对象
3、伴生对象中同样会帮我们实现 unapply 方法,从而可以将 case class 应用于模式匹配
apply 方法接受参数返回对象,unapply 方法接收对象返回参数
4、实现自己的 toString、hashCode、copy、equals 方法
5、case class 主构造函数里面没有修饰符,默认的是 val
package com.meng.nan.day715
import scala.util.Random
//样例类
object ExampleClass extends App {
//case class 是多例的,后面要跟构造参数,case object 是单例的
var arr=Array(CheckTimeOutTask,HearBeat(123),SumbitTask("0001","task"))
//模式匹配
arr(Random.nextInt(arr.length)) match {
case SumbitTask(id,name)=>{
println(s"$id,$name")
}
case HearBeat(time)=>{
println(time)
}
case CheckTimeOutTask=>{
println("check")
}
}
}
//样例类
//不加够造方法
case object CheckTimeOutTask
//加够造方法
case class HearBeat(time:Long)
case class SumbitTask(id:String,name:String)
object样例类
package com.meng.nan.day715
object ObjectClass {
def main(args: Array[String]): Unit = {
//object样例类
/**
* 在 Scala 中 Option 类型样例类用来表示可能存在或也可能不存在的值(Option 的子类有 Some
* 和 None)。Some 包装了某个值,None 表示没有值
*/
val map=Map("a"->1,"b"->2)
val v=map.get("b") match {
case Some(i)=>i
case None=>0
}
println(v)
//有返回值,没有返回默认值
val v1=map.getOrElse("c",0)
println(v1)
}
}
偏函数
被包在花括号内没有 match 的一组 case 语句是一个偏函数,它是 PartialFunction[A, B]的一
个实例,A 代表参数类型,B 代表返回值类型,常用作输入模式匹配
package com.mazh.scala.day2.oop
object PartialFuncDemo {
//偏函数
def func1: PartialFunction[String, Int] = {
case "one" => 1
case "two" => 2
case _ => -1 }
//普通函数的模式匹配实现
def func2(num: String) : Int = num match {
case "one" => 1
case "two" => 2
case _ => -1 }
def main(args: Array[String]) {
println(func1("one"))
println(func2("one"))
} }
总结:
偏函数,就是用来做模式匹配的