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是泛型,运行时有更完善的类型匹配,反射获取类型的信息