Scala模式匹配和类型系统

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)

QT学习笔记&#xff08;三&#xff09;&#xff1a;Qt软件打包发布&#xff08;QT5.8 _msvc2013_64Win10_64&#xff09;1.编译方式介绍&#xff1a;2.动态编译方式打包发布QT程序&#xff1a;方法一&#xff1a;手动复制方法二&#xff1a;使用工具问题&解决&#xff1a;环…

贝叶斯用于文档分类

from numpy import *def loadDataSet():# 词条切分后的文档集合&#xff0c;列表每一行代表一个文档postingList [[my, dog, has, flea, please],[not, take, him, to, dog, stupid],[my, is, cute, love, him],[stop, posting, stupid, worthless, garbage],[my, licks, my, …

使用pt-heartbeat检测主从复制延迟

不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间&#xff0c;原因如下&#xff1a; A&#xff1a;备库Seconds_behand_master值是通过将服务器当前的时间戳与二进制日志中的事件的时间戳对比得到的&#xff0c;所以只有在执行事件时才能报告延迟 B&#xff1a;如果备库复…

麦肯锡报告摘译:未来成功城市的14个特征

来源&#xff1a;TOP产业办公研究院【前言】&#xff1a;本文摘译自麦肯锡发布的一份研究报告。报告来源&#xff1a;McKinsey&Company Report: Thriving amid turbulence: Imagining the cities of the future. Authored by Jonathan Woetzel , Vineet Rajadhyaksha , Joe…

编程关键词介绍...

编程关键词介绍&#xff1a; gcc是GUN compiler Collection (GUN编译器套件)&#xff0c;也可以简单理解为编译器&#xff0c;他可以编译多种语言。 GNU是基于Unix开发设计&#xff0c;并且是与Unix兼容的操作系统&#xff0c;该项目由Richard Stallman在1983年创建&#xff…

MATLAB编辑GUI界面

在命令窗口输入&#xff1a;guide 即可进入编辑 若要在GUI界面的一个面板上显示程序中随意给定的字符&#xff1a; 首先创建一个“可编辑文本”&#xff08;位于左侧工具栏&#xff09;&#xff1a; 双击该面板&#xff0c;弹出该面板的工具栏&#xff0c;设置“string”&am…

单个神经元不可靠!这项新研究推翻以往认知,感知的最大限制在于解码过程...

来源&#xff1a;凹非寺“单个神经元不可靠&#xff01;”一项关于神经元的研究&#xff0c;让众人看嗨了。这项研究通过在小鼠身上做实验&#xff0c;先展示了神经元“不靠谱”的一面&#xff1a;单个神经元两次对相同视觉刺激的反应&#xff0c;竟然是不一样的。对于神经元的…

(转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在

问题描述&#xff1a;在用vs生成MVC时若使用Internet应用程序为模版&#xff0c;项目建好后重新编译下无法通过&#xff0c;弹出错误&#xff1a; 解决方案&#xff1a;问题出来后&#xff0c;询问了身边很多人都是一头雾水&#xff0c;于是乎各种谷歌和百度&#xff0c;还好功…

QT学习笔记(四):Qt5+MSVC编译 中文字符显示乱码问题解决

QT学习笔记&#xff08;四&#xff09;&#xff1a;Qt5MSVC编译 中文字符显示乱码问题解决问题&#xff1a;1、解决方法一&#xff1a;2、解决方法二&#xff1a;3、解决方法三&#xff1a;4、解决方法四&#xff1a;结果显示&#xff1a;Qt5MSVC编译 中文字符显示乱码。 现在为…

github单独下载某个文件或文件夹

首先下载tortoiseSVN&#xff0c;安装好之后打开github项目的地址&#xff0c;例如https://github.com/rbgirshick/fast-rcnn 单独下载某个文件夹&#xff1a; 如果只需要下载tools这个文件夹&#xff0c; 点进这个文件夹&#xff0c;复制该页面的网址得到https://github.com/…

技术架构大迁徙时代来临,10个关键点读懂数字化转型

来源&#xff1a;THINKTANK新智囊2月&#xff0c;在旧金山举办的IBM Think 2019大会上&#xff0c;IBM CEO、总裁及董事长Ginni Rometty提出当前正在进入数字化重塑2.0阶段&#xff08;Digital Reinvention, Chapter II&#xff09;&#xff1a;数字化重塑的第二篇章&#xff0…

QT学习笔记(五):Qt5的8种标准对话框示例

QT学习笔记&#xff08;五&#xff09;&#xff1a;Qt5的8种标准对话框示例前言实例展示1.颜色对话框2.文件对话框3.字体对话框4.输入对话框5.消息对框6.进度对话框7.错误信息对话框8.向导对话框.前言 QT 提供了常用的对话框类型&#xff0c;他们全部继承自QDialog类&#xff…

桌面SVN检出这一选项消失

进入‪C:\Users\“你的计算机名”\Desktop桌面 这个文件夹&#xff0c;找到隐藏文件夹“.svn”&#xff0c;删除这个隐藏文件夹就OK了

在连续发布版本的情况下 如何做好测试?

在连续发布版本的情况下 如何做好测试&#xff1f;1、跟项目经理协商&#xff0c;确定每一个版本的测试重点。比如&#xff0c;只进行基本功能验证&#xff0c;或者是冒烟测试&#xff0c;挑选重要的功能的测试用例&#xff0c;每次只执行这些。比如&#xff0c;只进行主要流程…

张亚勤、刘慈欣、周鸿祎、王飞跃新书推荐,《崛起的超级智能:互联网大脑如何影响科技未来》...

《崛起的超级智能&#xff1a;互联网大脑如何影响科技未来》2019年7月由中信出版社出版&#xff0c;前沿科技趋势研究专家&#xff0c;计算机博士刘锋著。张亚勤、刘慈欣、周鸿祎、王飞跃、约翰翰兹推荐&#xff01;吕乃基、石勇、吕本富做序。《崛起的超级智能&#xff1a;互联…

QT学习笔记(六):Qt5主窗口框架示例

QT学习笔记&#xff08;五&#xff09;&#xff1a;Qt5主窗口框架代码示例 一、添加编辑菜单&#xff1a;并在下拉菜单和工具栏中添加“打开文件”动作菜单 #include <QToolButton> #include <QSpinBox> #include <QTextEdit> #include <QMdiSubWindow&…

Pytorch 为什么每一轮batch需要设置optimizer.zero_grad

根据pytorch中的backward()函数的计算&#xff0c;当网络参量进行反馈时&#xff0c;梯度是被积累的而不是被替换掉&#xff1b;但是在每一个batch时毫无疑问并不需要将两个batch的梯度混合起来累积&#xff0c;因此这里就需要每个batch设置一遍zero_grad 了。 其实这里还可以…

ARM与RISC-V之争,后起之秀的优势在哪儿?

来源&#xff1a;朗锐智科从2010年夏天开始&#xff0c;伯克利研究团队大约花了四年的时间&#xff0c;设计和开发了一套完整的新的指令集。这个新的指令集叫做RISC-V&#xff0c;指令集从2014年正式发布之初就受到多方质疑&#xff0c;到2017年印度政府表示将大力资助基于RISC…

QT学习笔记(六):QString::arg()函数用法小结

QT学习笔记&#xff08;五&#xff09;&#xff1a;Qt5的QString的arg用法 在QT的QString中&#xff0c;arg方法类似于C中的printf中使用的格式输出符&#xff08;只是有点类似&#xff09;。 在QT5的帮助文档中&#xff0c;可以看出以下几点&#xff1a; 使用arg(str1, str2,…