为了更好的驾驭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
时间: 2024-12-28 14:42:37