Scala 中的 Match Case 模式匹配、偏函数与样式类
目录
一、模式匹配(Match Case)
二、偏函数(PartialFunction)
三、样例类
一、模式匹配(Match Case)
Scala 提供了强大的模式匹配机制,应用也非常广泛。
一个模式匹配包含了一系列备选项,每个都开始于关键字 case。
每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。
模式匹配(Match Case)相当于Java中的Switch case default
模式匹配的用法如下:
package com.bjsxt.scala/* Match 模式匹配* match case 相当于Java中的Switch case default一样* 1.case _ 什么都匹配不上的时候用的,相当于java中default,放最后* 2.match 可以匹配值还可以匹配类型,值的话就直接传入值就行,类型就传入 参数名:类型* 3.匹配过程中会有数值的转换,如1.0会自动转为Int类型的1,但1.2就不会* 4.从上到下匹配,匹配上之后会自动终止,不往下匹配了* 5.模式匹配外部的"{.....}"大括号可以省略,因为match模式匹配只是一句*/
object Lesson_Match {def main(args: Array[String]): Unit = {val tp = (1,1.2,"abc",'a',true)val iter: Iterator[Any] = tp.productIteratoriter.foreach(MatchTest)//等价于iter.foreach(s =>{MatchTest(s)}) == iter.foreach(MatchTest(_)})}// * 5.模式匹配外部的"{.....}"大括号可以省略,因为match模式匹配只是一句def MatchTest(o:Any): Unit ={o match {case 1=>println("value is 1")// * 2.match 可以匹配值还可以匹配类型,值的话就直接传入值就行,类型就传入 参数名:类型case i:Int => println(s"type is Int,value = $i")case d:Double => println(s"type is Double,value = $d")case s:String => println(s"type is String,value = $s")case 'a' => println("value is c")case _ => println("no match...")// * 1.case _ 什么都匹配不上的时候用的,相当于java中default,放最后}}
}
注意点:
- 模式匹配不仅可以匹配值还可以匹配类型
- 从上到下顺序匹配,如果匹配到则不再往下匹配
- 都匹配不上时,会匹配到case _ ,相当于default
- match 的最外面的”{ }”可以去掉,因为match{...}可以看成是一个语句
二、偏函数(PartialFunction)
如果一个方法中没有 match 只有case,这个函数可以定义成 PartialFunction 偏函数。偏函数定义时,不能使用括号传参,默认定义 PartialFunction 中传入一个值,匹配上了对应的case,返回一个值。PartialFunction 当中给定的类型是需要匹配的类型和返回值的类型。
偏函数的用法如下:
package com.bjsxt.scala/* 偏函数,只能匹配一个值,匹配上了返回对应的值* PartialFunction[A,B] A是匹配的类型,B是匹配上返回的类型*/
object Lesson_PartialFun {//定义偏函数,偏函数不能传参,定义标准形式:def 函数名:PartialFunction[A,B] ={}//这里的模式匹配类型只能是一种def MyTest:PartialFunction[String,Int] = {case "abc" => 2case "a" => 1case _ => 200}def main(args: Array[String]): Unit = {val result: Int = MyTest("abdc")println(result)}
}
三、样例类
使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类。实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,它将帮你实现setter和getter方法。
注意点:
(1)样例类默认帮你实现了toString,equals,copy和hashCode等方法。
(2)样例类可以new, 也可以不用new
package com.bjsxt.scala/* 样例类(case classes)* 1.使用了case关键字的类定义就是样例类(case classes),样例类是种特殊的类* 实现了类构造参数的getter方法(构造参数默认被声明为val),当构造参数是声明为var类型的,* 它将帮你实现setter和getter方法* 2.样例类默认帮你实现了toString,equals,copy和HashCode等方法* 3.样例类可以new,也可以不用new*/
//定义样例类
case class Person1(var name:String,age:Int)object CaseClass {def main(args: Array[String]): Unit = {val p1 = new Person1("zhangsan", 19)val p2 = new Person1("zhangsan", 19)// * 3.样例类可以new,也可以不用newval p3 = Person1("zhangsan", 32)//这里用的equals、toString都是已经实现好的,不然比较和打印的都是地址println(p1.equals(p2))println(p3)}
}