Scala 模式匹配

Scala 模式匹配

类似于java的switch case
可以匹配内容、集合、类型…


语法

1
2
3
4
5
6
7
8
变量 match{
case1 => ...
case2 => ...
case3 => ...
_ => ...
}

//*scala不需要break
根据集合匹配:

例1:

1
2
3
4
5
6
7
8
9
10
val a1 = Array("a","b","c","d")

val a11 = a1(Random.nextInt(a1.length))

a11 match {
case "a" => print("这是a")
case "b" => print("这是b")
case "c" => print("这是c")
case _ => print("这是哪个?")
}

例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
def greeting(array: Array[String]): Unit = {
array match {
case Array("a") => println("这是只有一个a")
case Array(x,y) => println("这是" + x + ", " + y)
case Array("a",_*) => println("这是a开头的多个")
case _ => println("都没有匹配上")
}
}

greeting(Array("a"))
greeting(Array("a","b"))
greeting(Array("a","b","c"))
greeting(Array("c"))
结果:
1
2
3
4
这是只有一个a
这是a, b
这是a开头的多个
都没有匹配上

例3:

1
2
3
4
5
6
7
8
9
10
11
12
13
def greeting1(array: List[String]): Unit = {
array match {
case "a":: Nil => println("有且只有一个a")
case x::y::Nil => println("这是" + x + ", " + y)
case "a"::tail => println("这是a开头的多个")
case _ => println("都没有匹配上")
}
}

greeting1(List("a"))
greeting1(List("a","b"))
greeting1(List("a","b","c"))
greeting1(List("c"))
结果:
1
2
3
4
这是只有一个a
这是a, b
这是a开头的多个
都没有匹配上
根据类型匹配:

例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def matchType(obj: Any): Unit = {
obj match {
case i:Int => println("这是Int类型")
case s:String => println("这是String类型")
case m:Map[_,_] => println("这是Map类型")
case _ => println("未找到的类型")
}
}

matchType(1)
matchType("a")
matchType(Map("a" -> 1))
matchType(1L)
}
结果:
1
2
3
4
这是Int类型
这是String类型
这是Map类型
未找到的类型

例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val aas = Map("a" -> "a1", "b" -> "b1", "c" -> "c1")

def matchaa(key:String): Unit ={
val aa = aas.get(key)
aa match {
case Some(aa) => println("key对应的value为" + aa)
case None => println("key没有匹配上...")
}
}

matchaa("a")
matchaa("b")
matchaa("c")
matchaa("d")
结果:
1
2
3
4
key对应的value为a1
key对应的value为b1
key对应的value为c1
key没有匹配上...
模式匹配在工作中主要用于异常处理:

IO操作、数据库操作
1)open
2)todo…
3)release

例1:

1
2
3
4
5
6
try{
val i = 1/0
} catch {
case e:ArithmeticException => println("除数不能为0...")
//case e:Exception => println(e.getMessage)
}
结果:
1
除数不能为0...

例2:

1
2
3
4
5
6
try{
val i = 1/0
} catch {
//case e:ArithmeticException => println("除数不能为0...")
case e:Exception => println(e.getMessage)
}
结果:
1
/ by zero

例3:

1
2
3
4
5
6
7
try{
//open
} catch {
case e:Exception => println(e.getMessage)
} finally {
//关闭文件流或释放数据库连接
}