Scala-模式匹配

  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.样例类

  1. 代码实现
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)
  1. 当一个类被声明为case class的时候,有如下注意事项
    1. 构造器中的参数如果不被声明为 var 的话,它默认的话是 val 类型的,但一般不推荐将构造器中的参数声明为 var
    2. 自动创建伴生对象,同时在里面给我们实现子 apply 方法,使得我们在使用的时候可以不直接显示地 new 对象
    3. 伴生对象中同样会帮我们实现 unapply 方法,从而可以将 case class 应用于模式匹配apply 方法接受参数返对象,unapply 方法接收对象返回参数
    4. 实现自己的 toString、hashCode、copy、equals 方法
    5. 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 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_29362113/article/details/89459986
今日推荐