Scala 模式匹配 类似于java的switch case 可以匹配内容、集合、类型…
语法 1 2 3 4 5 6 7 8 变量 match { case 值1 => ... case 值2 => ... case 值3 => ... _ => ... }
根据集合匹配: 例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(1 L) }
结果: 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..." ) }
结果:
例2:
1 2 3 4 5 6 try { val i = 1 /0 } catch { case e:Exception => println(e.getMessage) }
结果:
例3:
1 2 3 4 5 6 7 try { } catch { case e:Exception => println(e.getMessage) } finally { }