Scala之模式匹配(match case)

  • Post author:
  • Post category:其他


Scala的match表达式类似于其他语言中的switch语句,它可以提供给你在多个备选项中做选择。基本上match表达式可以让你使用任意的模式(pattern)做选择。



1. 按值匹配

def valueMatch(fruit: String) {
    fruit match {
      case "apple" => print("apple")
      case "banana" => print("banana")
      case "orange" => print("orange")
    }
}

match表达式检测参数fruit,如果是字符串”apple”就打印”apple”,如果是”banana”,就打印”banana”,如此类推。



2. 按对象类型匹配

def classMatch(obj: Any): Unit = {
    obj match {
      case x: Int => print(x + " is int")
      case x: String => print(x + " is string")
      case x: List[Int] => print(x + " is list")
    }
}

按类型匹配时,case语法为:case 自定义变量名: 要匹配的类类型 => 执行语句。如果不需要在执行语句中使用这个变量,可以把自定义变量名使用下划线(_)代替。需要注意的时当期望匹配目标类型时List, Tuple等含有泛型参数的高阶类型时,

由于泛型擦除机制的缘故,无法正确识别参数类型T

classMatch(List("hello", "ok"))
 
运行结果:
List(hello, ok) is list



3. 通配模式

下划线(

)可以用来表示匹配任意的对象。在上面的按值匹配的例子中,如果传入的参数是 “hello”,程序会报匹配异常错误,正确的做法是加入下划线(

)匹配,从而忽略掉程序中你不关心的部分:

def valueMatch(fruit: String) {
    fruit match {
      case "apple" => print("apple")
      case "banana" => print("banana")
      case "orange" => print("orange")
      case _ => print("unknown") 
    }
 }



4. 构造器模式

与Java的Switch语句比,匹配表达式还有一些重要的差别。其中之一是任意类型的常量,或其他什么东西,都能当成Scala里比较用的样本(Case),而不只是Java的case语句里面的整数类型和枚举常量。另一个区别是在每个备选项的最后并没有break。取而代之的是,break是隐含的,也就是说,不允许从上一个备选项落入到下一个里面去的情况发生。然而,与Java的switch相比,最显著的差别或许是match表达式能产生值。在上面的例子里,match表达式的每个备选项不但可以通过打印输出值,还可以只生成返回值而不打印:

def simpleMatch(fruit: String) {
    val name = fruit match {
      case "apple" => "apple"
      case "banana" => "banana"
      case "orange" => "orange"
      case _ => "unknown"
    }
    name
 }

参考

原文链接:https://blog.csdn.net/u012361112/article/details/90690275



版权声明:本文为Lzx116原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。