码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-06 14:58:07      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:

java switch-case(对值)
scala不仅对值,而且可以对类型,集合(map,list元数据匹配),object,class
scala大量使用模式匹配(match case)

Scala的模式匹配,与Java的switch case的区别

1.不仅可以匹配值,可以匹配类型

2.可以匹配数组的集合
相同数组、长度相同的数组、以某个元素开头的数组
对于长度相同的数组,会进行自动变量赋值

3.匹配class - 样例类case class
类似于Java里的Bean
一般都不可改变,默认只有getter
可用于消息通信
基类传参数,用match匹配不同的子类去接收和处理
Some()和None(),在模式匹配时表示匹配到和匹配不到
case class 和 case object区别前者会生成多个实例,后者只有一个实例,就是它本身

data输入数据,是一个String
下划线表示既不是spark也不是hadoop
简单示例
技术分享

类似于switch case语句
下划线代表默认情况
可以在默认下用if进行分支判断

def bigData(data: String, age: Int){
data match{
case "Spark" => println("Wow!!") 
case "Hadoop" => println("OK!!")
case data_ if(age>18) => println("adult")
case _ => println("nothing")
}
}

传入两个参数
技术分享
传入两个参数改写
技术分享

match外的变量,可以自动传给match里的变量
data赋值给data_

def bigData(data : String){
   data match{
    case "Spark" => println("wow")
    case "Hadoop" => println("ok")
    case data_ if data_ == "Flink" => println("cool"+data_)
    case _ => println("something else")
   }
}

输出结果
技术分享

类型匹配
异常类型进行匹配,第一种类型匹配,匹配FileNotFound,Exception本身打印出来,包括完整的包名,类名,后面是填入的信息oops

import java.io._
def exception(e :Exception){
e match{
case fileException : FileNotFoundException => println("File Not Found:"+fileException)
case _: Exception => println("Exception getting thread dump from $executorId",e)
}
}

技术分享

集合匹配
数组,数组中指定的元素,指定个数的元素的数组,以及数组以某元素开头的数组,Set,list一致的
Array的模式匹配
传入三个元素,分别赋值给spark,hadoop,flink(它们是三个变量)

def data(array:Array[String])
{
array match{
case Array("Scala") => println("Scala")
case Array(spark,hadoop,flink) => println(spark+" : "+hadoop+" : "+flink)
case Array("Spark", _*) => println("Spark ...")//以Spark开头
case _ => println("Unknown")
}

技术分享

类匹配
case class 相当于java中javabean 默认是val类型 只有getter方法 ,通过case class可以进行类的模式匹配

def sayHi(person:Person){
person match{
      case Student(name,score) => println("I am a studnet:"+name+score)
      case Worker(name,salary) => println("I am a worker:"+name+salary)
      case _ =>println("Unknow")
     }
     }

自动匹配到worker(worker,student是person的子类)
技术分享

case class 生成多个实例
case object 只有一个实例

泛型函数

class Person[T](val content : T){
def getContent(id : T) = id + " _ " + content  
}

val p = new Person[String]("Spark")
p.getContent("Scala")//必须为String 类型

技术分享

类型体系

泛型类、泛型函数、类型界定(upperBound)、视图界定(View Bounds)、协变和逆变等

类型参数,主要用于类型限定,加强代码的健壮性

1.泛型类和泛型函数

2.类型界定

对类型也可以限定边界,upperBounds(<:表示,上边界,是它或它的子类),(>:表示,下边界,是某个类的父类或类本身)

3.视图界定

视图界定(View Bounds)
View Bounds隐式转换
对类型进行implicit隐式转换

implict  def rddToSequendeFileRDDFuncions[K <% Wirtable:ClassTag,V <% Writable:ClassTag]

类型[T],在上下文中注入隐式值,而且注入的过程是自动的

class Compare[T :ordering](val n1:T,val n2:T){
def bigger(implicit ordered :Ordering[T])=
}

Manifest->ClassTag
T:ClassTag,T是泛型,运行时有更完善的类型匹配,反射获取类型的信息

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

标签:

原文地址:http://blog.csdn.net/sundujing/article/details/51323163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!