加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala模式匹配和样例类

发布时间:2020-12-16 18:56:44 所属栏目:安全 来源:网络整理
导读:Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句、类型检查等。并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配。 1、字符匹配 ????def main(args: Array[String]): Unit = { ??????val charStr = ‘6‘ ??????char

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,7)

tup match {

case (1,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、样例类当中的applyunapply方法自动生成

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")

???????????????? }

????????????????}

? ?

? ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读