class MatchScore {
def scoreGrade(grade: String) {
grade match {
case "A" => println("优秀")
case "B" => println("良好")
case "C" => println("中等")
case "D" => println("及格")
case _ => println("你去重考吧")
}
}
}
如上,如果case 值为下划线,则代表了不满足以上所有情况下的默认情况,类似于default。
match case中,只要一个case分支满足并处理了,就不会继续下一个case了,不需要像java中需要break。
object Demo {
def main(args: Array[String]) {
println(matchTest("two"))
println(matchTest("test"))
println(matchTest(1))
}
def matchTest(x: Any): Any = x match {
case 1 => "one"
case "two" => 2
case y: Int => "scala.Int"
case _ => "many"
}
}
其中的值与不同数据类型的模式的数据进行匹配。
可以直接匹配类型,而不是值。在java中无法直接匹配类型。
格式:case 变量:类型=>匹配后的执行代码语句
object CaseDemo01 extends App{
val arr = Array("hello", 1, 2.0, CaseDemo)
val v = arr(Random.nextInt(4))
println(v)
v match {
case x: Int => println("Int " + x)
case y: Double if(y >= 0) => println("Double "+ y)
case z: String => println("String " + z)
case _ => throw new Exception("not match exception")
}
}
Double if(y >= 0) =>,这里是添加的守卫条件。如果不符合守卫条件,将进入case_中。
val list = List(-1,0,1,2,3)
list match {
case 0 :: Nil => println("only 0")
case x :: y :: Nil => println(s"x: $x y: $y")
case 0 :: tail => println("0 ...")
case _ => println("something else")
}
在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
注意:
:: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
样例类是一种特殊的类,可用于模式匹配.用case class进行声明,有点类似于Java中的JavaBean的概念。
定义形式:
case class 类型,是多例的,后面要跟构造参数。 case class Student(name:String)
case object 类型,是单例的。 case object Person
class MatchPerson {
def personIdentify(p: Person) {
p match {
case Teacher(name, subject) => println("Teacher," + name + ", subject:" + subject)
case Student(name, classGrade) => println("Student, " + name + ", classGrade :" + classGrade)
case _ => println("没有证件,不能进校")
}
}
}
class Person
case class Teacher(name: String, subject: String) extends Person
case class Student(name: String, classGrade: String) extends Person
Scala中,Option类型用样例类来表示可能存在或者可能不存在的值(Option的子类有Some和None)。
Option有两种值,一种是Some,表示有值,一种是None,表示没有值。
Some包装了某个值,None表示没有值.
Spark源码中大量地使用了Option,比如Some(a)、None这种语法
class Grades {
val grades = Map("xiaoming" -> "A", "xiaohong" -> "B", "xiaogang" -> "C")
def getGrade(name: String) {
val grade = grades.get(name)
grade match {
case Some(grade) => println("your grade is " + grade)
case None => println("Sorry, no this grade in the grades")
}
}
}
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型。
偏函数常用作输入模式匹配,最大的特点是它只接受和处理: 其参数定义域的一个子集。
object PartialFuncTest {
val func1: PartialFunction[String, Int] = {
case "A" => 1
case "B" => 2
case _ => -1
}
def func2(num: Int) : Int = num match {
case 10 => 1000
case 20 => 0
case _ => -1
}
def main(args: Array[String]) {
println(func1("c"))
println(func2(20))
}
}