提取器Extractor(二十一)

簡介

  Scala 提取器是一個帶有unapply方法的對象。unapply方法算是apply方法的反向操作:unapply接受一個對象,然後從對象中提取值。

簡單實例

//提取郵箱地址
object Test {
   def main(args: Array[String]) {

      println ("Apply 方法 : " + apply("Zara", "gmail.com"));
      println ("Unapply 方法 : " + unapply("[email protected]"));
      println ("Unapply 方法 : " + unapply("Zara Ali"));

   }
   // 注入方法 (可選)
   def apply(user: String, domain: String) = {
      user +"@"+ domain
   }

   // 提取方法(必選)
   def unapply(str: String): Option[(String, String)] = {
      val parts = str split "@"
      if (parts.length == 2){
         Some(parts(0), parts(1)) 
      }else{
         None
      }
   }
}

提取器中使用模式匹配

  編譯器在實例化對象時會調用 apply 方法。在提取器對象中使用match 語句時,unapply 將自動執行。

object Test {
   def main(args: Array[String]) {

      val x = Test(5)
      println(x)

      x match
      {
         case Test(num) => println(x + " 是 " + num + " 的兩倍!")
         //unapply 被調用
         case _ => println("無法計算")
      }

   }
   def apply(x: Int) = x*2
   def unapply(z: Int): Option[Int] = if (z%2==0) Some(z/2) else None
}

提取匹配的IP地址子段

object RegexMatch {
  def main(args: Array[String]): Unit = {
    val ipRegex="(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)".r
    for(ipRegex(one,two,three,four) <- ipRegex.findAllIn("192.168.1.1")){
      println("IP子段1:"+one)
      println("IP子段2:"+two)
      println("IP子段3:"+three)
      println("IP子段4:"+four)
    }
  }
}

提取郵箱中的用戶名

object RegexMatch {
  def main(args: Array[String]): Unit = {
    val sparkRegex="^([\\w-]+(\\.[\\w-]+)*)@[\\w-]+(\\.[\\w-]+)+$".r
    for(sparkRegex(domainName,_*) <- sparkRegex.findAllIn("[email protected]"))
    {
      println(domainName)
    }
  }
}

忠於技術,熱愛分享。歡迎關注公衆號:java大數據編程,瞭解更多技術內容。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章