溫馨提示×

溫馨提示×

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

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

關(guān)于Scala模式匹配的案例分析

發(fā)布時(shí)間:2020-06-29 16:35:34 來源:億速云 閱讀:169 作者:清晨 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Scala模式匹配的案例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

一.scala模式匹配(pattern matching)

pattern matching可以說是scala中十分強(qiáng)大的一個(gè)語言特性,當(dāng)然這不是scala獨(dú)有的,但這不妨礙它成為scala的語言的一大利器。

scala的pattern matching是類似這樣的,

e match {
 case Pattern1 => do Something
 case Pattern2 if-clause => do others
 ...
}

其中,變量e后面接一個(gè)match以及一個(gè)代碼塊,其中每個(gè)case對應(yīng)一種可能回匹配的類型,如果匹配成功則執(zhí)行=>后面的代碼。

我們可以用一個(gè)具體一些的例子來看看模式匹配是怎么工作的:

case class Player(name: String, score: Int)
def printMessage(player: Player) = player match {
 case Player(_, score) if score > 100000 =>
  println("Get a job, dude!")
 case Player(name, _) =>
  println("Hey, $name, nice to see you again!")
}

看起來有點(diǎn)類似于其他語言的switch,但其實(shí)還是有很大的不同的。

以java的switch為例,java的switch僅僅會做一些基本類型的匹配,然后執(zhí)行一些動(dòng)作,并且是沒有返回值的。

而scala的pattern matching match則要強(qiáng)大得多,除了可以匹配數(shù)值,同時(shí)它還能匹配類型。

def parseArgument(arg: String) = arg match {
  //匹配值
  case "-h" | "--help" => displayHelp
  case "-v" | "--version" => displayVerion
  case whatever => unknownArgument(whatever)
}
def f(x: Any): String = x match {
  //匹配類型
  case i:Int => "integer: " + i
  case _:Double => "a double"
  case s:String => "I want to say " + s
}

同時(shí)pattern matching是有返回值的,比如上面的match,它返回的就是一個(gè)Unit。我們也可以修改上面的代碼讓它返回一個(gè)字符串:

case class Player(name: String, score: Int)
def message(player: Player) = player match {
 case Player(_, score) if score > 100000 =>
  "Get a job, dude!"
 case Player(name, _) =>
  "Hey, $name, nice to see you again!"
}

值得一提的是,pattern matching 返回值是由第一個(gè)匹配的模式中的代碼塊決定的。

二. 為什么要用pattern matching

看到這里你會發(fā)現(xiàn)一個(gè)問題,pattern matching不是和if else差不多嗎?那為什么還要使用pattern matching呢?

首先我們需要明白,模式匹配其實(shí)本質(zhì)上是提供一個(gè)方便的解構(gòu)(Destructuring)數(shù)據(jù)結(jié)構(gòu)的方式,以scala為例,pattern matching其實(shí)用到了scala中提取器的功能,提取器其實(shí)就是類中的unapply()方法。

trait User {
 def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {
 //提取器
 def unapply(user: FreeUser): Option[String] = Some(user.name)
}
 val user: User = new FreeUser("Daniel")
 user match {
  case FreeUser(name) => println("it match here" + name)
  case _ => println("not me")
 }

明白了模式匹配的本質(zhì)你就會直到,其實(shí)if else只是pattern matching中的一個(gè)典型的用法,但并非它的全部。

同時(shí),pattern matching允許你解耦兩個(gè)并不真正屬于彼此的東西,也使得你的代碼更易于測試。比如上面的match部分的代碼我們可以寫成下面這樣:

 val user: User = new FreeUser("Daniel")
 //將返回結(jié)果存在一個(gè)常量中
 val message = user match {
  case FreeUser(name) => "it match here" + name
  case _ => "not me"
 }
 //可以隨意使用該常量,實(shí)現(xiàn)解耦
 println(message)

這樣會賦予代碼更多的靈活性,同時(shí)也更加方便做進(jìn)一步操作。

而以可讀性的角度來說,使用一大堆的if else代碼無疑是比較難看的,而如果使用pattern matching的話,代碼會簡潔清晰很多,而簡潔的代碼則會更容易閱讀。

關(guān)于Scala模式匹配的案例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

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

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

AI