您的位置:首页 > 其它

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

2016-12-19 23:48 232 查看
在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)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala