Scala模式匹配-值匹配与简单类型匹配

本文介绍了Scala中的模式匹配,包括简单匹配,类似于Java的Switch语句,以及在match中使用值、变量和类型进行匹配。示例代码展示了如何匹配特定值、类型,以及如何利用变量进行解构匹配,强调了在使用变量匹配时需用反引号包裹。
摘要由CSDN通过智能技术生成

在Scala的模式匹配中,可以使用类型、通配符、序列、正则表达式,甚至可以深入获取对象的状态。这种对象状态的获取遵循一定的协议,也就是对象内部状态的可见性由该类型的实现来控制,这样我们就可以获取暴露的状态并应用于变量中。对象的获取往往被称为“提取”或者“解构”。

1、简单匹配

简单匹配有点类似Java中的Switch语句,会匹配每一个确定的值。具体如下:

 def match_boolean(): Unit ={
    val bools = Seq(true,false)
    for(bool <- bools){
      bool match {
        case true => println("Got heads")
        case false => println("Got tails")
      }
    }
  }

在上述代码中,首先创建了一个序列,针对每一个元素使用match匹配,其匹配可能性只存在true和false两种情况。这与大多数语言的模式匹配是一致的,当然一般开发中的匹配是比较复杂的,上述代码只是作为实例代码而已。

2、match中的值、变量和类型

Scala中,模式匹配可以使用值、变量、类型作为匹配内容。以下例子能匹配特定得某个值(与Java得switch相似),也可以匹配特定类型,如:判定是字符串、Double等。

def match_any():Unit={
    for{x <- Seq(1,2,2.7,"one","two",'four)}{
      val str = x match {
        case 1  => "int 1" //匹配值为1的整数
        case i:Int => "other int: " + i //匹配非1的整形内容,将匹配项赋值给变量i
        case d: Double => "a double: " + x//匹配Double类型内容,将匹配项赋值给变量d
        case "one" => "string one"//匹配字符串为“one”
        case s: String => "other string:" + s//匹配除“one”的其他字符串
        case unexpected => "unexpected value:" + unexpected//除以上几种匹配的所以模式
      }
      println(str)
    }

对于上边实例,只是为了演示模式匹配效果,并且可以将需要匹配内容直接赋值给另外一个变量。当然上述示例中没有任何意义,无论是i或者d都是与x相同。但是这种语法可以方便我们匹配Tuple类型等,可以直接将Tuple类型解析,如:case (v1:Int,v2:Int) => "v1:"+v1+",v2:"+v2这段代码代码表示,如果匹配项是一个Tuple2类型,那么将.1赋值给v1,将._2赋值给v2。这样就可以在后续表达式中直接使用v1、v2两个变量。当然对于上述示例,就不需要特意定义变量,可以直接使用占位符(““)即可。 具体代码如:

 def match_any():Unit={
    for{x <- Seq(1,2,2.7,"one","two",'four)}{
      val str = x match {
        case 1  => "int 1" //匹配值为1的整数
        case _:Int => "other int: " + _ //匹配非1的整形内容,将匹配项赋值给变量i
        case _: Double => "a double: " + x//匹配Double类型内容,将匹配项赋值给变量d
        case "one" => "string one"//匹配字符串为“one”
        case _: String => "other string:" + _//匹配除“one”的其他字符串
        case unexpected => "unexpected value:" + unexpected//除以上几种匹配的所以模式
      }
      println(str)
    }
  }

到现在,我们接触的模式匹配都是使用静态量匹配,或者使用类型等。但是,在Scala中,我们可以使用已经定义的变量来匹配(这可能是一个很大的惊喜哦,在实际开发中,可以用来根据不同条件提取数据)。具体如:

  def match_variable(y:Int):Unit = {
    for {
      x <- Seq(99,100,101)
    }{
      val str = x match {
        case `y` => "found y!"//需要特别注意,这里不可以使用case y,必须用反引号来引用变量
        case _:Int =>s"int:$x"
      }
      println(str)
    }
  }

我们首先通过函数参数传入变量y,然后在匹配中,引用y来与匹配项比较,如果匹配成功,则执行后续代码。需要特别注意,在使用变量匹配时,必须用反引号“`”来包围变量,如上例中“y”。
像Java中,一般可能会针对多种匹配类型执行同样操作,我们一般会在最后一条满足条件的判断上写入需要执行的操作,然后break,如:

 switch (i){
            case 'a':
            case 'b':
                System.out.println("print");
                break;
        }

Scala中也支持针对不同的匹配子句需要使用相同的处理代码的情况,而且代码逻辑更简单明了。

 x match {
      case 'a' | 'b' => println(x)
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值