溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Scala模式匹配的方法

發(fā)布時(shí)間:2022-02-19 10:27:16 來源:億速云 閱讀:161 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Scala模式匹配的方法”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Scala模式匹配的方法”文章能幫助大家解決問題。

Scala模式匹配的方法

簡單匹配

Scala的模式匹配最常用于match語句中。下面是一個(gè)簡單的整型值的匹配實(shí)例。

val colorNum = 1
val colorStr = colorNum match {
   case 1 => "red"   case 2 => "green"   case 3 => "yellow"   case _ => "Not Allowed"}
println(colorStr)

為了測(cè)試上面代碼,可以直接把上面代碼放入到“/usr/local/scala/mycode/test.scala”文件中,然后,在Linux系統(tǒng)的Shell命令提示符狀態(tài)下執(zhí)行下面命令:

scala test.scala

Shell 命令

另外,在模式匹配的case語句中,還可以使用變量。

val colorNum = 4
val colorStr = colorNum match {
   case 1 => "red"   case 2 => "green"   case 3 => "yellow"   case unexpected => unexpected + " is Not Allowed"  
}
println(colorStr)

按照前面給出的方法,在test.scala文件中測(cè)試執(zhí)行上述代碼后會(huì)在屏幕上輸出:

4 is Not Allowed

也就是說,當(dāng)colorNum=4時(shí),值4會(huì)被傳遞給unexpected變量。

類型模式

Scala可以對(duì)表達(dá)式的類型進(jìn)行匹配。

for (elem "Spark","Hadoop",'Hello)){
   val str  = elem match{
       case i: Int => i + " is an int value."
       case d: Double => d + " is a double value."
       case "Spark"=> "Spark is found."
       case s: String => s + " is a string value."
       case _ => "This is an unexpected value."
   }
println(str)    
}

在test.scala文件中測(cè)試執(zhí)行上述代碼后會(huì)在屏幕上輸出:

9 is an int value.
12.3 is a double value.
Spark is found.
Hadoop is a string value.
This is an unexpected value.

“守衛(wèi)(guard)”語句

可以在模式匹配中添加一些必要的處理邏輯。

for (elem case _ if (elem %2 == 0) => println(elem + " is even.")
           case _ => println(elem + " is odd.")
   }
}

上面代碼中if后面條件表達(dá)式的圓括號(hào)可以不要。執(zhí)行上述代碼后可以得到以下輸出結(jié)果:

1 is odd.
2 is even.
3 is odd.
4 is even.

for表達(dá)式中的模式

我們之前在介紹“映射”的時(shí)候,實(shí)際上就已經(jīng)接觸過了for表達(dá)式中的模式。 還是以我們之前舉過的映射為例子,我們創(chuàng)建的映射如下:

val university = Map("XMU" -> "Xiamen University", "THU" -> "Tsinghua University","PKU"->"Peking University")

循環(huán)遍歷映射的基本格式是:

for ((k,v)

對(duì)于遍歷過程得到的每個(gè)值,都會(huì)被綁定到k和v兩個(gè)變量上,也就是說,映射中的“鍵”被綁定到變量k上,映射中的“值”被綁定到變量v上。

下面給出此前已經(jīng)介紹過的實(shí)例:

for ((k,v) printf("Code is : %s and name is: %s\n",k,v)

上面代碼執(zhí)行結(jié)果如下:

Code is : XMU and name is: Xiamen University
Code is : THU and name is: Tsinghua University
Code is : PKU and name is: Peking University

case類的匹配

case類是一種特殊的類,它們經(jīng)過優(yōu)化以被用于模式匹配。

case class Car(brand: String, price: Int)
val myBYDCar = new Car("BYD", 89000)
val myBMWCar = new Car("BMW", 1200000)
val myBenzCar = new Car("Benz", 1500000)for (car case Car("BYD", 89000) => println("Hello, BYD!")
       case Car("BMW", 1200000) => println("Hello, BMW!")
       case Car(brand, price) => println("Brand:"+ brand +", Price:"+price+", do you want it?")        
   }
}

把上述代碼放入test.scala文件中,運(yùn)行“scala test.scala”命令執(zhí)行后可以得到如下結(jié)果:

Hello, BYD!
Hello, BMW!
Brand: Benz, Price:1500000, do you want it?

Option類型

標(biāo)準(zhǔn)類庫中的Option類型用case類來表示那種可能存在、也可能不存在的值。 一般而言,對(duì)于每種語言來說,都會(huì)有一個(gè)關(guān)鍵字來表示一個(gè)對(duì)象引用的是“無”,在Java中使用的是null。Scala融合了函數(shù)式編程風(fēng)格,因此,當(dāng)預(yù)計(jì)到變量或者函數(shù)返回值可能不會(huì)引用任何值的時(shí)候,建議你使用Option類型。Option類包含一個(gè)子類Some,當(dāng)存在可以被引用的值的時(shí)候,就可以使用Some來包含這個(gè)值,例如Some(“Hadoop”)。而None則被聲明為一個(gè)對(duì)象,而不是一個(gè)類,表示沒有值。 下面?zhèn)兘o出一個(gè)實(shí)例。

//首先我們創(chuàng)建一個(gè)映射scala> val books=Map("hadoop"->5,"spark"->10,"hbase"->7)books: scala.collection.immutable.Map[String,Int] = Map(hadoop -> 5, spark -> 10, hbase -> 7) //下面我們從映射中取出鍵為"hadoop"對(duì)應(yīng)的值,這個(gè)鍵是存在的,可以取到值,并且取到的值會(huì)被包含在Some中返回scala> books.get("hadoop")res0: Option[Int] = Some(5) //下面我們從映射中取出鍵為"hive"對(duì)應(yīng)的值,這個(gè)鍵是不存在的,所以取到的值是None對(duì)象scala> books.get("hive")res1: Option[Int] = None

scala

Option類型還提供了getOrElse方法,這個(gè)方法在這個(gè)Option是Some的實(shí)例時(shí)返回對(duì)應(yīng)的值,而在是None的實(shí)例時(shí)返回傳入的參數(shù)。例如:

scala> val sales=books.get("hive")sales: Option[Int] = None scala> sales.getOrElse("No Such Book")res3: Any = No Such Book scala> println(sales.getOrElse("No Such Book"))No Such Book

scala

可以看出,當(dāng)我們采用getOrElse方法時(shí),如果我們?nèi)〉摹県ive”沒有對(duì)應(yīng)的值,我們就可以顯示我們指定的“No Such Book”,而不是顯示None。 在Scala中,使用Option的情形是非常頻繁的。在Scala里,經(jīng)常會(huì)用到Option[T]類型,其中的T可以是Sting或Int或其他各種數(shù)據(jù)類型。Option[T]實(shí)際上就是一個(gè)容器,我們可以把它看做是一個(gè)集合,只不過這個(gè)集合中要么只包含一個(gè)元素(被包裝在Some中返回),要么就不存在元素(返回None)。既然是一個(gè)集合,我們當(dāng)然可以對(duì)它使用map、foreach或者filter等方法。比如:

scala> books.get("hive").foreach(println)

scala

可以發(fā)現(xiàn),上述代碼執(zhí)行后,屏幕上什么都沒有顯示,因?yàn)?,foreach遍歷遇到None的時(shí)候,什么也不做,自然不會(huì)執(zhí)行println操作。

關(guān)于“Scala模式匹配的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI