一天一段scala代碼(十四)

一天一段scala代碼(十四)

       爲了更好的駕馭spark,最近在學習scala語言特性,主要看《快學scala》,順便把一些自己認爲有用的代碼記下來。

package examples

object Example14 extends App{

  
var ch='9'
var sign= ch match{
  case '+' => 1
  case '-' => -1
  case _ if Character.isDigit(ch) => Character.digit(ch,10)   //守衛模式,加上條件
  case _ => 0   
  }
println(sign)

ch='8'
 sign= ch match{
  case c if Character.isDigit(c) => Character.digit(c,10)    //c=ch  變量模式
  case _ => 0
  }
println(sign)

import scala.math._

var x = Pi
var y = x match{
  case Pi => 3.14  //Pi is val,not Pi=x   匹配常量
}
println(y)


def matchConstant(x:Any)=
{
  val cPi = Pi
  x match
  {
    case `cPi` => 3.14  // `cPi` is val,等於上面的cPi,也就是Pi           匹配常量,一般常量是大寫開頭的,小寫的得加上 反引號
    case cPi => 3.1  // cPi=x   變量模式
    case _ => 3.0
  }
}

println(matchConstant(Pi))
println(matchConstant(3.11111))


//類型模式
def getInt(obj:Any) = 
{
  obj match
  {
    case x:Int => x
    case s:String => Integer.parseInt(s)
    case _:BigInt => Integer.MAX_VALUE
    case _ => 0
  }
}
println(getInt("456"))

//還可以匹配數組,列表,元組等。對於那些泛型,不能精準匹配,比如能匹配Map[_,_],而不能匹配Map[String,Integer]





//樣例類
abstract class Amount
case class Dollar(value:Double) extends Amount
case class Currency(value:Double,unit:String) extends Amount
//樣例類,自動生成apply和unapply方法

val amt = Currency(29.84,"EUR")
var price = amt.copy(value=19.92)
println(price)
price = amt.copy(unit="CHF")   //樣例類的拷貝方法,可以任意修改屬性
println(price)



//密封類 將超類聲明爲sealed,則其子類必須在同一個文件(超類所在文件)中定義



//偏函數 不對所有輸入都有定義的函數
//所有偏函數都是PartialFunction[A,B]的一個實例,A是輸入類型,B是輸出類型
val f:PartialFunction[Char,Int] = 
{
  case '+' => 1
  case '-' => -1
}

println(f('+'))

//偏函數可以是參數
val res = "-3+4".collect{
  case '+' => 1
  case '-' => -1
}
println(res)






}

輸出
9
8
3.14
3.14
3.1
456
Currency(19.92,EUR)
Currency(29.84,CHF)
1
Vector(-1, 1)

本文作者:linger
本文鏈接:http://blog.csdn.net/lingerlanlan/article/details/44892669
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章