一、Scala模式匹配
源码:Master
①def bigdata(data:String){
data match{
case "Spark" => print("")
case "Hadoop" =>print("")
case _ => print("")
}
}
②def bigdata(data:String,age:Int){
data match{
case "Spark" => print("")
case "Hadoop" =>print("")
case _ if data == "Flink" => print("" + data_ ) // 或者 case data_ if data_ == "Flink" => print("")
case _ =>print()
}
}
与Java模式匹配的不同:
Scala的模式匹配可以匹配类型
③def exception(e:Exception){
e match{
case fileException:FileNotFoundException => print("")
case _:Exception =>println()
}
}
④可以对集合进行匹配
def data(array:Array[String]){
array march{
case Array("Scala") =>print()
case Array(Spark,hadoop) => print() // 指定个数的匹配
case Array("Spark",_*)=> print()// 匹配Spark开头的元素
case _ => print()
}
}
注:集合中的模式匹配,经常会用到Some和None
⑤Case Class 模式匹配
case class Person(name : String) // 相当于Java的Javabean
Class Person()
case class Worker(name:String,salary:Double) extends Person
case class Student(name:String,age:Int) extends Person
def sayHi(person: Person){
case Student(name,score) =>print()
case Worker(name,salary)=>print()
case _ => print()
}
case class 与class object的区别:
case class 实际工作时会生成很多实例
case object 本身就是实例
二、Scala类型系统
泛型类:
定义:class Person[T](val content: T){
def getContent(id: T) = id + "_" + content
}
泛型函数:
定义:泛型类定义中的泛型函数
上边界:
RDD源码:
def saveAsTextFile(path:String,codec:[_ <: CompressioonCodec])//CompressioonCodec类型或者其子类型
下边界:
类型及其父类型
View Bounds:试图界定,有隐式转换
语法:<%
对类型进行隐式转换
源码:SparkContext
class Compare[T:Ordering](val n1:T,val n2:T){
def bigger(implicit ordered:Ordering[T]) = if(ordered,compare(ni1,n2) > 0) n1 else n2
}
new Compare[Int](1,2).bigger()
Manifest Context Bounds:
[T: Manifest] 演化成classTag
斜变:
class Person[+T] // 父类和子类之间,作为类型参数的类也会构成父类和子类
逆变:
[_]:存在类型,可以代表任何类型,如Dependency[_]相当于dependency[T]

本文介绍了Scala中的模式匹配概念及应用,包括基本的模式匹配、类型匹配、集合匹配及Case Class的使用,并探讨了Scala的类型系统,涉及泛型类、泛型函数、上边界、下边界、试图界定等高级特性。
365





