Scala模式匹配

模式匹配

Scala中的模式匹配类似于Java中的switch语法

但是Scala从语法中补充了更多的功能,所以更加强大

基本语法

模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分支开始,如果匹配成功,那么执行对应的逻辑代码,如果匹配不成功,继续执行下一个分支进行判断。如果所有case都不匹配,那么会执行case_分支,类似于Java 中default语句。

package chapter08

object Test01_PatternMatchBase {
  def main(args: Array[String]): Unit = {
    // 基本定义语法
    val x: Int = 2
    val y:String = x match {
      case 1 => "one"
      case 2 => "two"
      case 3 => "three"
      case _ => "zero"
    }

    println(y)

    // 实例:用模式匹配实现简单的二元运算
    val a=25
    val b=13

    def matchDualOp(op: Char): Any = op match {
      case '+' => a+b
      case '-' => a-b
      case '*' => a*b
      case '/' => a/b
      case _ => "非法运算符"
    }

    println(matchDualOp('+'))
    println(matchDualOp('*'))
    println(matchDualOp(';'))
  }
}
  • 如果所有case都不匹配,那么会执行case _ 分支,类似于Java中的default语句。若此时没有case _ 分支,那么会抛出MatchError
  • 每个case中,不需要使用break语句,自动中断case
  • match case 语句可以匹配任何类型,而不只是字面量(常量)
  • => 后面的代码块,直到下一个case语句之前的代码是作为一个整体执行,可以使用 {} 括起来,也可以不括。

模式守卫

如果想要匹配某个范围的数据,就需要在模式匹配中增加条件守卫。

package chapter08

object Test01_PatternMatchBase {
  def main(args: Array[String]): Unit = {
    // 模式守卫
    // 求一个整数的绝对值
    def abs(num: Int): Int = {
      num match {
        case i if i >= 0 => i
        case i if i < 0 => -i
      }
    }
  }
}

模式匹配类型

匹配常量

Scala中,模式匹配可以匹配所有的字面量,包括字符串,字符,数字,布尔值等等。

匹配类型

List存在泛型擦除,不管case List的泛型是什么,定义的任何List类型列表都可以与之匹配

匹配数组

匹配列表

匹配元组

匹配对象及样例类

变量声明中的模式匹配

for表达式中的模式匹配

偏函数中的模式匹配

原文地址:https://www.cnblogs.com/Gazikel/p/15782016.html