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] = worksheetest$Person@50134894

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 的隐式转换机制。

posted on 2016-01-21 01:32 hard-working 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/chenggongdeni/p/5147084.html

Scala模式匹配和类型系统相关推荐

  1. Scala模式匹配的亮点——Martin Odersky访谈(四)

    Martin Odersky向Bill Venners和Frank Sommers谈论Scala模式匹配的机制和目的. \\ Scala是一种新兴的通用用途.类型安全的Java平台语言,结合了面向对象 ...

  2. Scala模式匹配--样例类--密封样例类--偏函数

    Scala模式匹配--样例类--密封样例类--偏函数 模式匹配 等价于java的switch caseval c = '+'c match{case '+' => println(111)cas ...

  3. scala 模式匹配 match

    文章目录 一.match 基本介绍 二.match 的细节和注意事项 三.模式匹配之条件守卫 四.模式匹配之变量匹配.常量匹配 五.模式匹配之类型匹配 六.模式匹配之数组匹配 七.模式匹配之集合匹配 ...

  4. scala 模式匹配

    Scala 中的模式匹配类似于 Java 中的 switch 语法 1 基本语法 模式匹配语法中,采用 match 关键字声明,每个分支采用 case 关键字进行声明,当需 要匹配时,会从第一个 ca ...

  5. Scala模式匹配详解

    前言 Scala 中的模式匹配类似于 Java 中的 switch 语法 Java中的switch语法,default就是都不符合 int i = 10 switch (i) {case 10 :Sy ...

  6. 5、Scala模式匹配

    一.case class 用case修饰的Class 我们称之为Case Class.编译器看到这个case修饰的class,会为这个class加一些额外的特性: 1.编译器会为Case Class增 ...

  7. Scala模式匹配,case 字符串,case 匹配类型,case 匹配数组,case 匹配List,case 匹配元组,case匹配case class和case object

    一. 模式匹配和样例类 Scala有一个十分强大的模式匹配机制,可以应用到很多场合:如switch语句.类型检查等. 并且Scala还提供了样例类,对模式匹配进行了优化,可以快速进行匹配 1. 匹配字 ...

  8. scala 模式匹配详解 1

    什么是模式? 一些刚从java转到scala的同学在开发的过程中犹如深陷沼泽,因为很多的概念或风格不确定,scala里有很多的坑,模式匹配也算一个.我整理了一下自己所理解的概念,以及一些例子.这个系列 ...

  9. scala 模式匹配概念及用法示例

    概念 可以理解为升级版的java switch 1 java中的switch -case是一个分支结构,用于匹配整型(byte,short,int,char),字符串,枚举. (long类型不可以) ...

最新文章

  1. Windows核心编程 第十二章 纤程
  2. 初等数论四大基本定理
  3. windows 搭建python 虚拟环境 写程序_Windows下搭建Python虚拟环境
  4. panel中html怎么写,panel控件有什么用 请写出Panel控件的用途
  5. vue 转为静态html,Vue CLI 3使用:HTML和静态资源(五)
  6. 五大原则让你的代码不再受bug的困扰
  7. linux的常用操作——共享库
  8. idhttp返回乱码_HTTP客户端POST方式中文编码(乱码)解决方案(转)
  9. finereport字段显示设置_QA | 表单如何设置字段显示逻辑?
  10. Python怎么这么香(洛谷P2788题解,Java语言描述)
  11. go中defer的一个隐藏功能
  12. ECMAScript 类型转换
  13. 使用weui滚动加载结合php实现分类页数据列表
  14. 信息系统项目管理---第九章 项目人力资源管理
  15. Java Applet
  16. 基于Visual C++2010与windows SDK fo windows7开发windows7平台的tabletpc应用(1)-汉字手写轨迹输入
  17. PostgreSQL 时区问题
  18. C++ CEF3加载高清图片崩溃
  19. 关于CISC和RISC的一些总结
  20. C# winform 生成APP

热门文章

  1. 一、uniapp项目(封装异步请求、moment.js时间处理、封装手势滑动组件、下载图片到本地)
  2. LeetCode MySQL 1384. 按年度列出销售总额
  3. LeetCode 68. 文本左右对齐(字符串逻辑题)
  4. LeetCode 1014. 最佳观光组合
  5. LeetCode 476. 数字的补数(移位 异或^)
  6. oracle oci.dll的作用,ASP.NET bin目录中的Oracle oci.dll无法删除/不起作用
  7. 就业技术书文件表格_就业申请书
  8. Linux常用的命令及操作技巧
  9. 一建机电实务教材电子版_2020一建教材+章节习题+新旧教材对比【全科】免费送...
  10. (二十五)【NIPS 2017】Prototypical Networks for Few-shot Learning