目录
一、模式匹配(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.productIterator
iter.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" => 2
case "a" => 1
case _ => 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,也可以不用new
val p3 = Person1("zhangsan", 32)
//这里用的equals、toString都是已经实现好的,不然比较和打印的都是地址
println(p1.equals(p2))
println(p3)
}
}