Scala模式匹配说明和使用
在Scala中没有swich case 的语法结构,取而代之的是match case的语法,在Scala中被称为模式匹配,相较于switch的分支结构,match的功能就要强大许多了。它不仅可以匹配整形和字符还能匹配类相关的复杂数据结构。
匹配数值、字符以及字符串
object MatchOpsValue{
def main(args: Array[String]): Unit = {
matchTest(1)
matchTest("two")
matchTest('a')
matchTest(8)
yiledOps
}
def matchTest(x: Any):Any = x match{
case 1=>println(s"${x} is Scala.Int")
case "two"=>println(s"${x} is Scala.String")
case 'a'=>println(s"${x} is Scala.Char")
case _=>println(s"${x} is Scala.Any")
}
def yiledOps: Unit ={
println("后台输入一个字符:")
val ch=StdIn.readChar()
val sign = ch match{
case '+' => -1
case '-' => 1
case _ => 0
}
println (sign)
}
}
这里要注意match是一段代码块,代码块是有返回值的,所以可以用match进行赋值。
匹配类型
类型匹配是对类型检查和类型转化的简化,可以使用在多子类的操作中。
object MatchOpsClass {
def main(args: Array[String]): Unit = {
typeOps
}
def typeOps: Unit ={
class Person(name:String, age:Int){}
class Worker(name:String, age:Int) extends Person(name,age){
def work(): Unit ={
println(s"${name} 年龄${age}欺负一个60多岁的老同志,这不好!")
}
}
class OldMan(name:String, age:Int)extends Person(name,age){
def stand(): Unit ={
println(s"${name} ${age}的老同志啪一下就站起来了,很快啊!")
}
}
def doth(someOne:Person): Unit =
{
someOne match {
case worker:Worker => worker.work()
case oldman:OldMan => oldman.stand()
}
}
doth(new OldMan("马",80))
}
}
匹配集合
匹配集合的使用比较特殊。
object MatchOpsCollection {
def main(args: Array[String]): Unit = {
collectionOps
}
def collectionOps: Unit ={
val arr:Array[Int]=Array(0,1,3)
arr match{
/*匹配是否是三个元素并赋值*/
case Array(x,y,z) => println(s"${x},${y},${z}")
/*匹配是首元素为0的数组*/
case Array(0,_*) => println("数组以0开头")
case _ =>println("未能匹配")
}
}
}
匹配样例类
object MatchOpsCaseClass {
def main(args: Array[String]): Unit = {
caseops
}
def caseops: Unit ={
abstract class Expr
case class Var(name:String) extends Expr
case class UnOp(expr: Expr,operation:String) extends Expr
case class Number(num: Double) extends Expr
case class BinOp(left:Expr, operation:String, right:Expr) extends Expr
def test(exp:Expr): Unit =
{
exp match {
case Var(name)=>println(s"var:${name}")
case UnOp(Var(name),"+") =>println(s"var:${name}++")
case BinOp(Number(num1),"+",Number(num2))=>println(num1+num2)
case _=>println("Nothing matched!")
}
}
test(BinOp(Number(2.0),"+",Number(3.0)))
}
}
匹配Option
Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。
Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。
object MatchOpsOption {
def main(args: Array[String]): Unit = {
optiontest
}
def optiontest: Unit ={
val numMap:Map[Int,String]=Map(1->"3",2->"5",3->"7")
println(numMap.get(9)+show(numMap.get(9)))
def show(x:Option[String]): String = x match{
case Some(s) =>s
case None => "?"
}
}
}