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 的隐式转换机制。
Scala模式匹配和类型系统的更多相关文章
- scala模式匹配的使用
Scala模式匹配 Tip1:模式总是从上往下匹配,如果匹配不到则匹配case_项(类似Java中的default) Tip2:与Java和C语言不同,不需要在每个分支末尾使用break语句退出(不会 ...
- scala模式匹配详细解析
一.scala模式匹配(pattern matching) pattern matching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一 ...
- Spark记录-Scala模式匹配
Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...
- scala模式匹配与样例类
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...
- Scala模式匹配| 隐式转换
1. 模式匹配 Scala中的模式匹配类似于Java中的switch语法,但是更加强大.模式匹配语法中,采用match关键字声明,每个分支采用case关键字进行声明,当需要匹配时,会从第一个case分 ...
- scala 模式匹配详解 3 模式匹配的核心功能是解构
http://www.artima.com/scalazine/articles/pattern_matching.html这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻 ...
- scala 模式匹配详解 2 scala里是怎么实现的?
在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...
- scala 模式匹配详解 1
什么是模式? 一些刚从java转到scala的同学在开发的过程中犹如深陷沼泽,因为很多的概念或风格不确定,scala里有很多的坑,模式匹配也算一个.我整理了一下自己所理解的概念,以及一些例子.这个系列 ...
- Scala模式匹配常用
今天在工作中遇到的几个小问题,总结一下: 1.因为业务需要调用PHP的接口,获取到的返回体需要做一段逻辑处理,然而某个字段接收到的参数是io.serializable类型,字段的类型不是预期的stri ...
随机推荐
- DataTable分组归类
我们在做项目的时候,经常需要根据表或DataTable中某些字段来归类,为此就写出以下方法,帮组需要的人. #region 对DataTable进行分组 + public void GroupData ...
- 增强学习贪心算法与Softmax算法
(一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...
- EditPlus配置[C++] [Python] [Java] 编译运行环境
以前一直用Codeblocks写C++,eclipse写Java,再在eclipse里面集成PyDev写Python,首先无法忍受代码自动补全功能(这个功能也许你万分喜欢),也无法忍受如此重量级的ID ...
- 双栈排序 noip2008
首先可以看出第一个栈和第二个栈是没什么交集的,那么第一步是对这些元素分别归到两个栈里, 当存在k使i<j<k,a[k]<a[i]<a[j]时,i,j是不能放在一个栈里的,需要一 ...
- sqlserver 查询库中有多少张表
表数目:select count(1) from sysobjects where xtype='U' 视图数::select count(1) from sysobjects where xtype ...
- javascript去除首尾空白字符
if ( twocode.replace(/^\s+|\s+$/g,"")=="" ) { alert("二维码不能为空"); docume ...
- nginx 杂记
接触nginx一段时间,有些自己的心得,偶尔在网上会看到一些细小的知识点,总结于此 nginx是以多进程的方式来工作的.nginx在启动后,会有一个master进程和多个worker进程. maste ...
- js实用功能
//日期格式转换 Date.prototype.format = function (format) { /* * eg:format="yyyy-MM-dd hh:mm: ...
- Sqli-labs less 30
Less-30 Less-30与less-29原理是一致的,我们可以看到less-30的sql语句为: 所以payload为: http://127.0.0.1:8080/sqli-labs/Less ...
- 如何说服你的老板必须使用APM?
APM研究院 2015/04/24 16:56 2013年,某权威机构提供一组数据显示:亚马逊每100毫秒延迟会使销售额下降1%:雅虎一秒钟服务器延迟导致收入下降2.8%:谷歌搜索结果页面放缓100毫 ...