溫馨提示×

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

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

scala的提取器對(duì)象是什么

發(fā)布時(shí)間:2021-12-08 14:59:15 來(lái)源:億速云 閱讀:105 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“scala的提取器對(duì)象是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“scala的提取器對(duì)象是什么”吧!

提取器對(duì)象是一個(gè)包含有    unapply   方法的單例對(duì)象。  apply   方法就像一個(gè)構(gòu)造器,接受參數(shù)然后創(chuàng)建一個(gè)實(shí)例對(duì)象,反之    unapply   方法接受一個(gè)實(shí)例對(duì)象然后返回最初創(chuàng)建它所用的參數(shù)。  提取器常用在模式匹配和偏函數(shù)中。
import scala.util.Randomobject CustomerID {  def apply(name: String) = s"$name--${Random.nextLong}"  def unapply(customerID: String): Option[String] = {    val stringArray: Array[String] = customerID.split("--")    if (stringArray.tail.nonEmpty) Some(stringArray.head) else None  }}val customer1ID = CustomerID("Sukyoung")  customer1ID match {  case CustomerID(name) => println(name)    case _ => println("Could not extract a CustomerID")}
這里    apply   方法用    name   創(chuàng)建一個(gè)    CustomerID   字符串。  而    unapply   方法正好相反,它返回    name   。  當(dāng)我們調(diào)用    CustomerID("Sukyoung")   ,其實(shí)是調(diào)用了    CustomerID.apply("Sukyoung")   的簡(jiǎn)化語(yǔ)法。  當(dāng)我們調(diào)用    case CustomerID(name) => println(name)  ,就是在調(diào)用提取器方法。
因?yàn)樽兞慷x可以使用模式引入變量,提取器可以用來(lái)初始化這個(gè)變量,使用 unapply 方法來(lái)生成值。  
val customer2ID = CustomerID("Nico")val CustomerID(name) = customer2IDprintln(name)
上面的代碼等價(jià)于   val name = CustomerID.unapply(customer2ID).get。  
   val CustomerID(name2) = "--asdfasdfasdf"
如果沒(méi)有匹配的值,會(huì)拋出    scala.MatchError  :
   
   val CustomerID(name3) = "-asdfasdfasdf"
unapply 方法的返回值應(yīng)當(dāng)符合下面的某一條:
  • 如果只是用來(lái)判斷真假,可以返回一個(gè) Boolean 類(lèi)型的值。
    例如 case even()。
  • 如果只是用來(lái)提取單個(gè) T 類(lèi)型的值,可以返回 Option[T]。
  • 如果你想要提取多個(gè)值,類(lèi)型分別為 T1,...,Tn,可以把它們放在一個(gè)可選的元組中 Option[(T1,...,Tn)]。
有時(shí),要提取的值的數(shù)量不是固定的,因此我們想根據(jù)輸入來(lái)返回隨機(jī)數(shù)量的值。這種情況下,你可以用  unapplySeq 方法來(lái)定義提取器,此方法返回  Option[Seq[T]]。常見(jiàn)的例子有,用  case List(x, y, z) => 來(lái)解構(gòu)一個(gè)列表  List,以及用一個(gè)正則表達(dá)式  Regex 來(lái)分解一個(gè)字符串  String,例如
   
   case r(name, remainingFields @ _*) =>

到此,相信大家對(duì)“scala的提取器對(duì)象是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

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