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

本文深入探讨Scala中的模式匹配(match-case)特性,介绍其与Java switch-case的主要区别,并通过实例展示如何在数组、异常处理及类匹配中使用该特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值