Scala模式匹配-值匹配与简单类型匹配
2016-12-19 23:48
232 查看
在Scala的模式匹配中,可以使用类型、通配符、序列、正则表达式,甚至可以深入获取对象的状态。这种对象状态的获取遵循一定的协议,也就是对象内部状态的可见性由该类型的实现来控制,这样我们就可以获取暴露的状态并应用于变量中。对象的获取往往被称为“提取”或者“解构”。
在上述代码中,首先创建了一个序列,针对每一个元素使用match匹配,其匹配可能性只存在true和false两种情况。这与大多数语言的模式匹配是一致的,当然一般开发中的匹配是比较复杂的,上述代码只是作为实例代码而已。
对于上边实例,只是为了演示模式匹配效果,并且可以将需要匹配内容直接赋值给另外一个变量。当然上述示例中没有任何意义,无论是i或者d都是与x相同。但是这种语法可以方便我们匹配Tuple类型等,可以直接将Tuple类型解析,如:
到现在,我们接触的模式匹配都是使用静态量匹配,或者使用类型等。但是,在Scala中,我们可以使用已经定义的变量来匹配(这可能是一个很大的惊喜哦,在实际开发中,可以用来根据不同条件提取数据)。具体如:
我们首先通过函数参数传入变量y,然后在匹配中,引用y来与匹配项比较,如果匹配成功,则执行后续代码。需要特别注意,在使用变量匹配时,必须用反引号“`”来包围变量,如上例中“y”。
像Java中,一般可能会针对多种匹配类型执行同样操作,我们一般会在最后一条满足条件的判断上写入需要执行的操作,然后break,如:
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) }
相关文章推荐
- 第4集:Scala模式匹配、类型系统彻底精通与Spark源码阅读
- Scala 专题教程-Case Class和模式匹配(1):简单的示例
- Scala模式匹配和类型系统
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- 第4讲:Scala模式匹配、类型系统彻底精通与Spark源码阅读
- Scala 模式匹配的五种情形,值,case class ,optional ,数据类型,集合内数据
- 3000门徒内部训练绝密视频(泄密版)第4课:Scala模式匹配、类型系统彻底精通与Spark源码阅读
- scala Case Class和模式匹配(1):简单的示例
- Scala模式匹配、类型系统与Spark源码阅读
- 第四课 Scala模式匹配、类型系统彻底精通与Spark源码阅读
- Scala模式匹配、类型系统彻底精通与Spark源码阅读
- Scala中的模式匹配——Option类型中的模式匹配
- 5.scala模式匹配及样例类的简单练习--RPC通信
- 第4讲:Scala模式匹配和类型系统
- scala 的模式匹配与类型系统
- day4-Scala模式匹配、类型系统
- 2016 第四讲 Scala模式匹配、类型系统彻底精通与Spark源码阅读
- scala-简单的模式匹配
- Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、
- Scala模式匹配,case 字符串,case 匹配类型,case 匹配数组,case 匹配List,case 匹配元组,case匹配case class和case object