口碑好的專業(yè)網(wǎng)站建設(shè)手機(jī)助手
文章目錄
- 每日一句正能量
- 章節(jié)概要
- 1.5 Scala的模式匹配與樣例類
- 1.5.1 模式匹配
- 字符匹配
- 匹配字符串
- 守衛(wèi)
- 匹配類型
- 匹配數(shù)組、元組、集合
- 1.5.2 樣例類
- 課外補(bǔ)充
- 偏函數(shù)
每日一句正能量
“成功的秘訣,在于對(duì)目標(biāo)的執(zhí)著追求。”——愛迪生
無論是在工作、學(xué)習(xí)、還是生活中,只有對(duì)目標(biāo)有著真正的執(zhí)著追求,才有可能取得成功。愛迪生是個(gè)成功的發(fā)明家,也是一個(gè)努力不懈、堅(jiān)持不斷的實(shí)踐者。他曾說過:“沒有人能夠一次成功,成功的秘訣就在于多次失敗后依然不放棄對(duì)目標(biāo)的執(zhí)著追求?!?/p>
所以,只有對(duì)自己的目標(biāo)有著強(qiáng)烈的追求,才能在取得成果的路上堅(jiān)持不懈地去奮斗,才能不怕失敗,不放棄,不斷地提高自己的能力和技巧。每一次失敗都是向成功更近一步的機(jī)會(huì),只要時(shí)刻保持目標(biāo)的執(zhí)著追求,堅(jiān)信自己一定能夠取得成功,就一定會(huì)邁向勝利。
章節(jié)概要
Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計(jì)的快速通用的計(jì)算引擎,它是由Scala語言開發(fā)實(shí)現(xiàn)的,關(guān)于大數(shù)據(jù)技術(shù),本身就是計(jì)算數(shù)據(jù),而Scala既有面向?qū)ο蠼M織項(xiàng)目工程的能力,又具備計(jì)算數(shù)據(jù)的功能,同時(shí)Spark和Scala的緊密集成,本書將采用Scala語言開發(fā)Spark程序,所以學(xué)好Scala將有助于我們更好的掌握Spark框架。
1.5 Scala的模式匹配與樣例類
Scala提供了強(qiáng)大的模式匹配機(jī)制,最常見的模式匹配就是math語句,主要應(yīng)用于從多個(gè)分支中進(jìn)行選擇的場(chǎng)景。
1.5.1 模式匹配
- Scala中的模式匹配是由match case組成,它類似于Java中的switch case。
- match關(guān)鍵字主要用來描述一個(gè)表達(dá)式,位于表達(dá)式位置的后面。
- case關(guān)鍵字主要用來描述和表達(dá)式結(jié)果進(jìn)行比較后的模式。
創(chuàng)建模式匹配的語法格式如下:
表達(dá)式 match {case 模式1 => 語句1case 模式2 => 語句2case 模式3 => 語句3
}
下面,定義一個(gè)方法matchTest(),方法的參數(shù)是一個(gè)整形字段,而方法的調(diào)用則是對(duì)參數(shù)進(jìn)行模式匹配,若參數(shù)匹配的是1,則打印輸出“one”;若參數(shù)匹配的是2,則打印輸出“two”;若參數(shù)匹配的是_,則打印輸出“many”,具體實(shí)現(xiàn)代碼如下所示。
package cn.itcast.scalaobject Ch12_PatternMatch {def main(args: Array[String]): Unit = {println(matchTest(5))}//模式匹配def matchTest(x:Int):String = x match{case 1 => "one"case 2 => "two"case _ => "many"}
}
結(jié)果如下圖所示:
字符匹配
def main(args: Array[String]): Unit = {val charStr = '6'charStr match {case '+' => println("匹配上了加號(hào)")case '-' => println("匹配上了減號(hào)")case '*' => println("匹配上了乘號(hào)")case '/' => println("匹配上了除號(hào)")//注意。所有的模式匹配都必須最終匹配上一個(gè)值,如果沒有匹配上任何值,就會(huì)報(bào)錯(cuò)// case _ => println("都沒有匹配上,我是默認(rèn)值")}}
匹配字符串
def main(args: Array[String]): Unit = {val arr = Array("hadoop", "zookeeper", "spark")val name = arr(Random.nextInt(arr.length))name match {case "hadoop" => println("大數(shù)據(jù)分布式存儲(chǔ)和計(jì)算框架...")case "zookeeper" => println("大數(shù)據(jù)分布式協(xié)調(diào)服務(wù)框架...")case "spark" => println("大數(shù)據(jù)分布式內(nèi)存計(jì)算框架...")case _ => println("我不認(rèn)識(shí)你...")}}
守衛(wèi)
模式匹配當(dāng)中,我們也可以通過條件進(jìn)行判斷def main(args: Array[String]): Unit = {var ch = "500"var sign = 0ch match {case "+" => sign = 1case "-" => sign = 2case _ if ch.equals("500") => sign = 3case _ => sign = 4}println(ch + " " + sign)
}
匹配類型
def main(args: Array[String]): Unit = {//注意泛型擦除,在模式匹配當(dāng)中的類型匹配中,除了Array類型以為,所有的其他的數(shù)據(jù)類型都會(huì)被擦除掉val a = 3val obj = if(a == 1) 1else 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 => xcase s: String => s.toIntcase BigInt => -1 //不能這么匹配case _: BigInt => Int.MaxValuecase 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)}
匹配數(shù)組、元組、集合
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")//匹配數(shù)組以1 開始作為第一個(gè)元素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表示空列表)要么是一個(gè)head元素加上一個(gè)tail列表。
9 :: List(5, 2) :: 操作符是將給定的頭和尾創(chuàng)建一個(gè)新的列表
注意::: 操作符是右結(jié)合的,如9 :: 5 :: 2 :: Nil相當(dāng)于 9 :: (5 :: (2 :: Nil))
1.5.2 樣例類
- 在Scala中,使用case關(guān)鍵字來定義的類被稱為樣例類。
- 樣例類是一種特殊的類,經(jīng)過優(yōu)化可以被用于模式匹配。
樣例類首先是類,除此之外它是為模式匹配而優(yōu)化的類,樣例類用case關(guān)鍵字進(jìn)行聲明。樣例類主要是使用在我們后面的sparkSQL當(dāng)中,通過樣例類來映射我們的表當(dāng)中的對(duì)象
定義形式:
- case class 類型,是多例的,后面要跟構(gòu)造參數(shù)。形式如下。
case class Student(name:String)
- case object 類型,是單例的。 形式如下。
case object Person
下面,使用case關(guān)鍵字來定義樣例類Person,并將該樣例類應(yīng)用到模式匹配中,具體代碼如下所示。
package cn.itcast.scalaobject Ch13_CaseClass {//定義樣例類case class Person(name:String,age:Int)def main(args: Array[String]): Unit = {//創(chuàng)建樣例類對(duì)象val alice = new Person("Alice", 25)val bob = new Person("Bob", 32)val charlie = new Person("Charlie", 33)//val tom = Person("tom",26) //這種方式創(chuàng)建也可以for(person <- List(alice,bob,charlie)){//模式匹配person match {case Person("Alice",25) => println("Hi Alice")case Person("Bob", 32) => println("Hi Bob")case Person("Charlie", 33) => println("Hi Charlie")//找不到以上匹配時(shí)case Person(name,age) => println("Name:"+name+"\t"+"Age:"+age)}}}
}
結(jié)果如下圖所示:
課外補(bǔ)充
偏函數(shù)
被包在花括號(hào)內(nèi)沒有match的一組case語句是一個(gè)偏函數(shù),它是PartialFunction[A, B]的一個(gè)實(shí)例,A代表輸入?yún)?shù)類型,B代表返回結(jié)果類型,常用作輸入模式匹配,偏函數(shù)最大的特點(diǎn)就是它只接受和處理其參數(shù)定義域的一個(gè)子集。
val func1: PartialFunction[String, Int] = {case "one" => 1case "two" => 2// case _ => -1}def func2(num: String) : Int = num match {case "one" => 1case "two" => 2case _ => -1}def main(args: Array[String]) {println(func1("one"))println(func2("one"))//如果偏函數(shù)當(dāng)中沒有匹配上,那么就會(huì)報(bào)錯(cuò),我們可以通過isDefinedAt來進(jìn)行判斷// println(func1("three"))println(func1.isDefinedAt("three"))if(func1.isDefinedAt("three")){println("hello world")}else{println("world hello")}
}
轉(zhuǎn)載自:https://blog.csdn.net/u014727709/article/details/133977059
歡迎start,歡迎評(píng)論,歡迎指正