Scala模式匹配和类型系统

1.模式匹配比java中的switch case强大很多,除了值,类型,集合等进行匹配,最常见的Case class进行匹配,Master.scala有大量的模式匹配。

Case "_"表示不满足上面的所有情况的体验,举个例子:

def bigdata(data: String){

data match{

case "Spack"=>println("WOW!!!")

case "Hadoop"=>println("OK")

case _=>println("sorry")

}

}

bigdata("Spack")    //Wow!!!

可以在case里面加入条件判断

def bigData(data:String)

{

data match{

case "Spark"=>println("Wow!!")

case "hadoop"=> println("ok")

case _ if data == "Flink" =>println("Flink")

case _=>println("other")

}

}

bigdata("Flink")  //Flink

对类型进行匹配

def exception(e: Exception){

e match{

casefileException:FileNotFoundException =>println("File not fount : " +fileException)

case _:Exception=>println("Exception" ,e) }

}

exception(new FileNotFoundException("oop!!!"))    //> File notfount : java.io.FileNotFoundException: oop!!!

对集合进行匹配

def data (array:Array[String])

{   arraymatch{

case Array("Scala")=>println("Scala")

caseArray(spark,hadoop,flink)=>println(spark +" : " +hadoop +" : " +flink +" : ")

case Array("Spark",_*)=>println("Spark...")

case _=>println("Unkown")

}

}                                                //> data: (array: Array[String])Unit

data(Array("Spark"))                              //> Spark...

data(Array("Scala"))                              //> Scala

data(Array("Scala","Spark","kafaka"))             //> Scala : Spark : kafaka :

对class进行匹配

scala> case class Person(name: String)

defined class Person

case classPerson(name: String)

Person("Spark")                                   // res0: worksheetest.Person = Person(Spark)

1:case class 相对于java中的bean,val 只有个get

2:实例自动调用伴生对象

class Person

case classWorker(name: String,salary: Double) extends Person

case classStudent(name: String,score: Double) extends Person

def sayHi(person:Person)

{

personmatch{

case Student(name,score)=>println("I am Student :"+name +","+score)

case Worker(name,salary)=>println("I am Worker :"+name +","+salary)

case _ =>println("Unknown")

}

}                                                 //> sayHi: (person: worksheetest.Person)Unit

sayHi(Worker("Worker",6.5))                       //> I am Worker :Worker,6.5

sayHi(Student("Student",6.5))                     //> I am Student :Student,6.5

DeployMessages源码中:

caseclassExecutorStateChanged(

appId:String,

execId:Int,

state:ExecutorState,

message:Option[String],

exitStatus:Option[Int])

extends DeployMessage

case class 使用时会生成很多对象

case object 本身就是一个实例,全局唯一

scala 的类型参数(重磅的东西)最好的难点,太有用了,在所有的spark源码中到处都是

例:RDD[T: ClassTag]

泛型,参数本身是有类型,scala的泛型,

泛型类和泛型函数

class Person[T](valcontent:T)

{

def getContent(id: T) = id+ " _ "+ content

}

val p = newPerson[String]("Spark")               //> p  :worksheetest.Person[String] = [email protected]

p.getContent("Scala")                             //> res0: String = Scala _ Spark

泛型前面有+和-

* scala> def mkArray[T : ClassTag](elems: T*) =Array[T](elems: _*)
* mkArray: [T](elems: T*)(implicit evidence$1:scala.reflect.ClassTag[T])Array[T]
*
* scala> mkArray(42, 13)
* res0: Array[Int] = Array(42, 13)
*
* scala> mkArray("Japan","Brazil","Germany")
* res1: Array[String] = Array(Japan, Brazil, Germany)
* }}}

协变:如果S是T的子类型,并且List[S]也是List[T]的子类型,那么成为协变 class Person[+T] //强制定义为协变类型

C[+T]:如果A是B的子类,那么C[A]是C[B]的子类。逆变范围小
C[-T]:如果A是B的子类,那么C[B]是C[A]的子类。协变 范围大
C[T]:无论A和B是什么关系,C[A]和C[B]没有从属关系。

注:阅读Spark源码 RDD、HadoopRDD、SparkContext、Master、Worker的源码,并分析里面使用的所有的模式匹配和类型参数的内容。

总结:

T <% Writable: ClassTag
T可以隐身转换为Writable类型
ClassTag在上下文中注入隐式值

对于Manifest Context Bounds
[T : Manifest] 进化为ClassTag了,T:ClassTag  运行时传递完整的类型上下文信息

Seq[Dependency[_]] 相当于Seq[Dependency[T]]

另外有段重要注释:

{{{
* scala> def mkArray[T : ClassTag](elems: T*) = Array[T](elems: _*)
* mkArray: [T](elems: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
*
* scala> mkArray(42, 13)
* res0: Array[Int] = Array(42, 13)
*
* scala> mkArray("Japan","Brazil","Germany")
* res1: Array[String] = Array(Japan, Brazil, Germany)
* }}}
*

表明了ClassTag 的隐式转换机制。

时间: 2024-10-10 14:04:09

Scala模式匹配和类型系统的相关文章

Scala模式匹配、类型系统与Spark源码阅读

java switch-case(对值) scala不仅对值,而且可以对类型,集合(map,list元数据匹配),object,class scala大量使用模式匹配(match case) Scala的模式匹配,与Java的switch case的区别: 1.不仅可以匹配值,可以匹配类型 2.可以匹配数组的集合 相同数组.长度相同的数组.以某个元素开头的数组 对于长度相同的数组,会进行自动变量赋值 3.匹配class - 样例类case class 类似于Java里的Bean 一般都不可改变,

Spark 3000门徒第四课scala模式匹配和类型参数总结

今晚听了王家林老师的Spark 3000门徒系列第四课scala模式匹配和类型参数,总结如下: 模式匹配:def data(array:Array[String]){ array match{ case Array(a,b,c) => println(a+b+c) case Array("spark",_*) => //匹配以spark为第一元素的数组 case _ => ... }} 课后作业是: 阅读Spark源码 RDD.HadoopRDD.SparkConte

scala模式匹配下的提取器动手构造实战

学习了scala模式匹配下的提取器动手构造实战,提取器的名称:>,提取器方法unapply,返回最后一个元素,和最后一个元素以前的若干元素,匹配最后一个元素是9,前面的是8,例子下: Object  :>{ Def  unapply[A](List:List[A])={ Some((list.init,list.last)) } } Object Extractor_Advanced{ Def main(args:Array[String]){ (1 to 9).toList match{ c

scala模式匹配下的赋值语句

学习了scala模式匹配下的赋值语句,模式匹配完成a和b的绑定,[email protected]其中a是b的别名,1000赋值给a和b,用元组的方式接收了1000和2000,二元组必须小写,大写会认为是常量,如果是大写要先定义,也可通过数组的方式进行赋值,例子如下 Def main(args:Array[String]){ Val [email protected]=1000 Println(“a=”+a+”,b=”+b) Val (c,d)=(1000,2000) Val Array(g,h

scala模式匹配与样例类

样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x")来构造Var对象.    2.样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护. 3.编译器为这个类添加了方法toString,hashCode和equals等方法. 模式匹配: match对应Java里的switch,但是写在选择器表达式之后.即: 选择器 match {备选项}. 一个

scala 模式匹配详解 3 模式匹配的核心功能是解构

http://www.artima.com/scalazine/articles/pattern_matching.html这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻译(不是连贯的): 模式可以嵌套,就像表达式嵌套,你可以定义深层的模式,通常一个模式看起来就像一个表达式.它基本上就是同一类事情.它看起来像一个复杂的对象树构造表达式,只是漏掉了new关键字.事实上在scala当你构造一个对象,你不需要new关键字然后你可以在一些地方用变量做站位符替代对象树上实际的

scala 模式匹配详解 2 scala里是怎么实现的?

在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/MatchingObjectsWithPatterns-TR.pdf我引用了里面的一些描述. 在面向对象的程序中数据被组织为一级一级的类(class)面向对象语言在模式匹配方面的问题在于如何从外部探测这个层级. 有6种实现模式匹配的方法:1) 面向对象的分解 (decomposition)2) 访问器模式

13、scala模式匹配

1.模式匹配的基础语法 2.对类型进行模式匹配 3.对Array和List的元素进行模式匹配 4.case class与模式匹配 5.Option与模式匹配 1.模式匹配的基础语法 Scala提供了match case语法,即模式匹配.替代java的switch case. 两者不同,java中switch case仅能匹配变量的值,比如1.2.3等:scala中的match case可以匹配各种类型,比如变量的类型.集合的元素.有值或无值. Match case语法:变量 match{ cas

深入理解Scala中的类型系统

核心内容: 1.Scala中定义类型的两种方式 2.Scala中的路径依赖 3.Scala中的自身类型以及自身类型的限定 4.Scala中的依赖注入 5.Scala中的链式风格调用--Type机制的用法 6.Scala中的复合数据类型 7.Scala中的抽象类型 8.Scala中的类型参数 9.Scala中的类型约束 10.Scala中的型变.逆变.协变 11.Scala中的结构类型 1.Scala中定义类型的两种方式 在Scala当中可以用以下两种方式定义类型: ①定义类.特质或对象 ②直接用