Scala之模式匹配(match case)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值