文章目录
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