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模式匹配和类型系统的更多相关文章

  1. scala模式匹配的使用

    Scala模式匹配 Tip1:模式总是从上往下匹配,如果匹配不到则匹配case_项(类似Java中的default) Tip2:与Java和C语言不同,不需要在每个分支末尾使用break语句退出(不会 ...

  2. scala模式匹配详细解析

    一.scala模式匹配(pattern matching) pattern matching可以说是scala中十分强大的一个语言特性,当然这不是scala独有的,但这不妨碍它成为scala的语言的一 ...

  3. Spark记录-Scala模式匹配

    Scala模式匹配 模式匹配是Scala函数值和闭包后第二大应用功能.Scala为模式匹配提供了极大的支持,处理消息. 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位.每个替代方案包括一个模 ...

  4. scala模式匹配与样例类

    样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...

  5. Scala模式匹配| 隐式转换

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

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

    http://www.artima.com/scalazine/articles/pattern_matching.html这篇文章是odersky谈scala中的模式匹配的一段对话,我做了部分片段翻 ...

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

    在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...

  8. scala 模式匹配详解 1

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

  9. Scala模式匹配常用

    今天在工作中遇到的几个小问题,总结一下: 1.因为业务需要调用PHP的接口,获取到的返回体需要做一段逻辑处理,然而某个字段接收到的参数是io.serializable类型,字段的类型不是预期的stri ...

随机推荐

  1. hope is a good thing!

    好久没有写博客了,在这么特殊的日子里,似乎不写点东西感觉总是少了点什么.其实从昨天开始就在努力的回忆,回忆自己这个2014年都做了些什么?自己收获了些什么?突然就觉得去年的那个暑假是那么的熟悉,怎么又 ...

  2. 【Construct Binary Tree from Preorder and Inorder Traversal】cpp

    题目: Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume t ...

  3. Netsharp快速入门(之19) 平台常用功能(插件操作)

    作者:秋时 暗影  转载须说明出处 6.2     插件操作 6.2.1  停用/启用 1.在平台工具-插件管理,右击对应的插件可以使用启用和停用功能.插件停用后会把所有相关的页签.程序集.服务全部停 ...

  4. WordPress按钮秒支付插件发布,支持微信支付,支付宝,银联,京东,苏宁,易宝支付

    痛点: 我们用WordPress建设网站和开发移动应用,有时候我们其实不需要太多的流程,只是需要一个收款通道,但是可能对支持的渠道更加关注,特别是手机应用.所以WordPress按钮秒支付插件诞生了, ...

  5. 设计模式之建造者模式(Builder)

    建造者模式原理:建造模式主要是用于产生对象的各个组成部分,而抽象工厂模式则用于产生一系列对象,建造者模式而且要求这些对象的组成部分有序. 代码如下: #include <iostream> ...

  6. 【BZOJ】【3790】神奇项链

    Manacher算法/DP 找出所有的回文串,看做是一个个线段,那么问题就转化成了用最少的线段将整个区间覆盖起来,可以重叠,那么这就是一个DP了= = Orz ZKY大爷,让蒟蒻开眼界了……头一次知道 ...

  7. shader 的 nounroll

    刚刚解决了一个特别坑的问题. 客户有个需求 需要shader里面 loop 的iterator数量 在运行时确定.z 这样对于里面存在  sample的loop就会被force unroll但因为co ...

  8. On Explainability of Deep Neural Networks

    On Explainability of Deep Neural Networks « Learning F# Functional Data Structures and Algorithms is ...

  9. iis express 启动多个网站

      iis express一次只能运行一个网站,  执行iisexpress 不加参数. 将执行配置文件中的第一个网站. iis express一次只能运行一个 应用程序池. 可以使用这个特点实现一次 ...

  10. Metasploit命令大全

    Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,密码审计, ...