Scala模式匹配和样例类
作者:互联网
Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。
1、字符匹配
def main(args: Array[String]): Unit = { val charStr = '6' charStr match { case '+' => println("匹配上了加号") case '-' => println("匹配上了减号") case '*' => println("匹配上了乘号") case '/' => println("匹配上了除号") //注意。所有的模式匹配都必须最终匹配上一个值,如果没有匹配上任何值,就会报错 // case _ => println("都没有匹配上,我是默认值") } } |
2、 匹配字符串
def main(args: Array[String]): Unit = { val arr = Array("hadoop", "zookeeper", "spark") val name = arr(Random.nextInt(arr.length)) name match { case "hadoop" => println("大数据分布式存储和计算框架...") case "zookeeper" => println("大数据分布式协调服务框架...") case "spark" => println("大数据分布式内存计算框架...") case _ => println("我不认识你...") }
} |
3、守卫
模式匹配当中,我们也可以通过条件进行判断
def main(args: Array[String]): Unit = { var ch = "500" var sign = 0 ch match { case "+" => sign = 1 case "-" => sign = 2 case _ if ch.equals("500") => sign = 3 case _ => sign = 4 } println(ch + " " + sign) } |
4、 匹配类型
def main(args: Array[String]): Unit = { //注意泛型擦除,在模式匹配当中的类型匹配中,除了Array类型以为,所有的其他的数据类型都会被擦除掉 val a = 3 val obj = if(a == 1) 1 else if(a == 2) "2" else if(a == 3) BigInt(3) else if(a == 4) Map("aa" -> 1) else if(a == 5) Map(1 -> "aa") else if(a == 6) Array(1, 2, 3) else if(a == 7) Array("aa", 1) else if(a == 8) Array("aa") val r1 = obj match { case x: Int => x case s: String => s.toInt case BigInt => -1 //不能这么匹配 case _: BigInt => Int.MaxValue case m: Map[String, Int] => "Map[String, Int]类型的Map集合" case m: Map[_, _] => "Map集合" case a: Array[Int] => "It's an Array[Int]" case a: Array[String] => "It's an Array[String]" case a: Array[_] => "It's an array of something other than Int" case _ => 0 } println(r1 + ", " + r1.getClass.getName) } |
5、匹配数组、元组、集合
def main(args: Array[String]): Unit = { val arr = Array(0, 3, 5) arr match { case Array(0, x, y) => println(x + " " + y) case Array(0) => println("only 0") //匹配数组以1 开始作为第一个元素 case Array(1, _*) => println("0 ...") case _ => println("something else") }
val lst = List(3, -1) lst 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") }
val tup = (1, 3, 7) tup match { case (1, x, y) => println(s"1, $x , $y") case (_, z, 5) => println(z) case _ => println("else") } } |
注意:在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。
9 :: List(5, 2) :: 操作符是将给定的头和尾创建一个新的列表
注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))
6、 样例类
样例类首先是类,除此之外它是为模式匹配而优化的类,样例类用case关键字进行声明。样例类主要是使用在我们后面的sparkSQL当中,通过样例类来映射我们的表当中的对象
定义形式:
case class 类型,是多例的,后面要跟构造参数。 case class Student(name:String)
case object 类型,是单例的。 case object Person
case class SubmitTask(id: String, name: String) case class HeartBeat(time: Long) case object CheckTimeOutTask //1、样例类当中的主构造器参数默认为val的 //2、样例类当中的apply和unapply方法自动生成 object CaseDemo04 extends App { val arr = Array(CheckTimeOutTask, HeartBeat(12333), SubmitTask("0001", "task-0001")) arr(2) match { case SubmitTask(id, name) => { println(s"$id,$name") println(id) println(name) println(id+"\t"+name) } case HeartBeat(time) => { println(time) } case CheckTimeOutTask => { println("check") } } } |
7、偏函数
被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表输入参数类型,B代表返回结果类型,常用作输入模式匹配,偏函数最大的特点就是它只接受和处理其参数定义域的一个子集。
val func1: PartialFunction[String, Int] = { case "one" => 1 case "two" => 2 // case _ => -1 }
def func2(num: String) : Int = num match { case "one" => 1 case "two" => 2 case _ => -1 }
def main(args: Array[String]) { println(func1("one")) println(func2("one")) //如果偏函数当中没有匹配上,那么就会报错,我们可以通过isDefinedAt来进行判断 // println(func1("three")) println(func1.isDefinedAt("three")) if(func1.isDefinedAt("three")){ println("hello world") }else{ println("world hello") } } |
标签:case,String,val,Scala,else,和样,例类,println,Array 来源: https://www.cnblogs.com/starzy/p/10466585.html