模式匹配
模式匹配是Scala中非常有特色,非常强大的一种功能。模式匹配,其实类似于Java中的swichcase语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理。对于Spark来说,Scala的模式匹配功能也是极其重要的,在spark源码中大量地使用了模式匹配功能。因此为了更好地编写Scala程序,并且更加通畅地看懂Spark的源码,学好模式匹配都是非常重要的
Scala是没有Java中的switchcase语法的,相对应的,Scala提供了更加强大的matchcase语法,即模式匹配,类替代switchcase,matchcase也被称为模式匹配。
matchcase的语法如下:变量match{case值=代码}。如果值为下划线,则代表了不满足以上所有情况下的默认情况如何处理。此外,matchcase中,只要一个case分支满足并处理了,就不会继续判断下一个case分支了。(与Java不同,java的switchcase需要用break阻止)。
Scala的matchcase与Java的switchcase最大的不同点在于,Java的switchcase仅能匹配变量的值,比1、2、3等;而Scala的matchcase可以匹配各种情况,比如变量的类型、集合的元素、有值或无值
对值进行匹配
如果是2的话呢?
这样可以用下面的办法解决
也可以用_(下划线)
匹配的时候是从下往上匹配的,所以我们改动下代码
对类型进行匹配
运行结果
对Array和List元素进行匹配
对caseclass进行匹配
对有值或没值进行匹配(Option)
元组
scala泛型
基本和Java一样,区别在于:Java使用表示泛型,scala使用[]表示泛型
泛型可以出现在class名称后面以及方法名称后面
classStudent[T]
defadd[T](t:T)
上下界:
[A1:A]:表示A是A1的下界,也就是A是A1的子类
[A1:A]:表示A是A1的上界,也就是A是A1的父类
协变/逆变:
[+T]:协变,如果有一个类C定义为C[T],而且A是B的父类,那么C[A]是C的父类
[-T]:逆变,如果有一个类C定义为C[T],而且A是B的父类,那么C是C[A]的父类
[T]:正常定义,如果有一个类C定义为C[T],而且A是B的父类,那么C[A]和C之间没有关系
隐式转换
注意:隐式转换函数只能转换一次
隐式转换函数
将一个对象通过定义的隐式转换函数转换成为另一个对象,主要在于某一个对象在调用某个方法的时候,
该对象实际上没有该方法,可以通过隐式转换将该对象转换为具有该方法的其他对象(隐式转换函数在当前作用域中存在)