一天一段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

时间: 2024-12-28 14:42:37

一天一段scala代码(十四)的相关文章

一天一段scala代码(四)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples object Example4 { def main(args: Array[String]) { //不可变Map val scores= scala.collection.immutable.Map("linger"->1,"angela"->2) //scores+=("la

一天一段scala代码(五)

一天一段scala代码(四) 为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples class Person { val publicVal = 1 //自动生成getter var publicVar = 2 //自动生成getter和setter //自定义getter和setter private var privateAge=0 def age = privateAge //getter

一天一段scala代码(十二)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples object Example12 extends App{ def mulBy1(factor:Double)=(x:Double)=>factor*x def mulBy2(factor:Double)(x:Double)=factor*x val triple = mulBy1(3) println(triple(8)) print

一天一段scala代码(十)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples //特质的基本使用 trait Logger { def log(msg:String) //不定义,抽象方法 } class ConsoleLogger extends Logger { def log(msg:String){println(msg)} //重写抽象方法不需要override } class Animal {} impor

一天一段scala代码(十五)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples object Example15 { //注解可以在程序中的各项条目添加信息,这些信息可以被编译器或外部工具处理. //下面是一个使用注解,指导编译器编译,为了供java方便调用. import scala.annotation.varargs @varargs def process(args:String*) {} //则编译器生成jav

一天一段scala代码(十六)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples object Example16 { //scala操作XML //scala本身自带了强大操作XML的功能,当然也可以调用java的包 //该部分没什么技术门槛,只是较为繁杂,用的时候再学习 //http://booksites.artima.com/programming_in_scala_2ed/examples/html/ch28.h

一天一段scala代码(十一)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples class Fraction(n:Int,d:Int) { private val num =n private val den=d def *(other:Fraction) = new Fraction(num*other.num,den*other.den) //重载称号操作符 } object Fraction { def apply

一天一段scala代码(三)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples import scala.collection.mutable.ArrayBuffer object Example3 { def main(args: Array[String]) { val start = System.currentTimeMillis println("took " + (System.curre

一天一段scala代码(二)

为了更好的驾驭spark,最近在学习scala语言特性,主要看<快学scala>,顺便把一些自己认为有用的代码记下来. package examples import scala.util.control.Breaks._ object Example2 { def main(args: Array[String]) { //if else 语法 val s = if(1==1) 1 else 0 println(s) //代码块 val d = { val s=1+1 val g = s*2