Scala之模式匹配
Scala 有一个十分强大的模式匹配机制,可以应用到很多场合:如 switch 语句、类型检查等。 并且 Scala 还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。本文主要采用代码实现的方式举例模式匹配的书写规则。
1.匹配字符串
代码实现:
package cn.mikeal.match2
import scala.util.Random
object Test1MatchString {
def main(args: Array[String]): Unit = {
val array = Array ("zhangsan", "lisi", "wangwu")
val name = array(Random.nextInt(array.length))
/**
* 模式匹配字符串
*/
name match {
case "zhangsan" => println("zhangsan")
case "liis" => println("lisi")
case "wangwu" => println("wangwu")
case _ => println("other")
}
}
}
2.匹配类型
代码实现:
package cn.mikeal.match2
import scala.util.Random
object Test2MatchType {
def main(args: Array[String]): Unit = {
val array = Array(1, 2.2, true, "zhangsan")
val value = array(Random.nextInt(array.length))
value match {
case x:Int => println("Int" + x)
case y:Double => println("Double" + y)
case z:String => println("String" + z)
case a:Boolean => println("Boolean" + a)
case _ => println("other")
}
}
}
3.匹配数组、元组、集合
代码实现
package cn.mikeal.match2
object Test3MatchArray {
def main(args: Array[String]): Unit = {
val array = Array(1, 3, 5)
array match {
case Array(1, x, y) => println(3)
case Array(0) => println(0)
case Array(0, _*) => println("*")
case _ => println("other")
}
val list = List(3, -1)
list match {
case x :: y :: Nil => println(2)
case x :: Nil => println(1)
case Nil => println(0)
case _ => println("other")
}
val tup = (2, 3, 7)
tup match {
case (1, x, y) => println(s"1, $x , $y")
case (_, z, 5) => println(z)
case _ => println("else")
}
}
}
4.样例类
- 代码实现
package cn.mikeal.match2
import scala.util.Random
object Test4MatchCase {
def main(args: Array[String]): Unit = {
val array = Array(Dog("wangwang"), Cat("miaomiao", 4), Pig("hengheng", 4, 1))
val value = array(Random.nextInt(array.length))
value match {
case Dog(name) => {
println(Dog.getClass.getName)
}
case Cat(name, age) => {
println(Cat.getClass.getName)
}
case Pig(name, age, sex) => {
println(Pig.getClass.getName)
}
case _ => println("other")
}
}
}
case class Dog(name: String)
case class Cat(name: String, age: Int)
case class Pig(name: String, age: Int, sex: Int)
- 当一个类被声明为case class的时候,有如下注意事项
- 构造器中的参数如果不被声明为 var 的话,它默认的话是 val 类型的,但一般不推荐将构造器中的参数声明为 var
- 自动创建伴生对象,同时在里面给我们实现子 apply 方法,使得我们在使用的时候可以不直接显示地 new 对象
- 伴生对象中同样会帮我们实现 unapply 方法,从而可以将 case class 应用于模式匹配apply 方法接受参数返对象,unapply 方法接收对象返回参数
- 实现自己的 toString、hashCode、copy、equals 方法
- case class 主构造函数里面没有修饰符,默认的是 val
5.Option 类型
代码实现:
package cn.mikeal.match1
/**
* 使用模式匹配实现getOrElse
*/
object MatchTest4_map {
def main(args: Array[String]): Unit = {
val map = Map(("a",1),("b",2),("c",3))
val key = "d"
println(map.getOrElse(key,100))
val value = map.get(key)
value match {
/**
* case class 样例类
* case object 样例对象 -- 就是用来做模式匹配的
*/
case Some(x) => x
case None => println(100)
}
}
}
6.偏函数
代码实现:
package cn.mikeal.partial
/**
* 偏函数就是没有match但是有一堆case分支的代码体
* 偏函数,就是用来做模式匹配的
*/
object PatialFunction {
def main(args: Array[String]): Unit = {
val i = abc("a")
println(i)
val j = abc1("a")
println(j)
}
/**
* [String,Int] 输入输出类型
* 第一个是输入泛型
* 第二个是输出泛型
*
* @return
*/
def abc: PartialFunction[String, Int] = {
case "a" => 1
case "b" => 2
case _ => 3
}
/**
* 实现和上边一样的效果,采用模式匹配的方式
* 标准的方法定义的方式
*/
def abc1(value:String):Int = {
value match {
case "a" => 1
case "b" => 2
case _ => 3
}
}
}
扫描二维码关注公众号,回复:
6093320 查看本文章