模式匹配
模式匹配是Scala中非常有特色,非常强大的一种功能。模式匹配,其实类似于Java中的swich case语法,即对一个值进行条件判断,然后针对不同的条件,进行不同的处理。对于Spark来说,Scala的模式匹配功能也是极其重要的,在spark源码中大量地使用了模式 匹配功能。因此为了更好地编写Scala程序,并且更加通畅地看懂Spark的源码,学好模式匹配都 是非常重要的
Scala是没有Java中的switch case语法的,相对应的,Scala提供了更加强大的match case语法,即模式匹配,类替代switch case,match case也被称为模式匹配。
match case的语法如下:变量 match { case 值 => 代码 }。如果值为下划线,则代表了不满足 以上所有情况下的默认情况如何处理。此外,match case中,只要一个case分支满足并处理了, 就不会继续判断下一个case分支了。(与Java不同,java的switch case需要用break阻止)。
Scala的match case与Java的switch case最大的不同点在于,Java的switch case仅能匹配变量 的值,比1、2、3等;而Scala的match case可以匹配各种情况,比如变量的类型、集合的元素、 有值或无值
对值进行匹配
![aea322e99342c7eecdea84647c3aceae.png](https://i-blog.csdnimg.cn/blog_migrate/5116790e46754f29107fa918c8a5a561.jpeg)
如果是2的话呢?
![21a51a72ec418a702fcb05ebfd1346c2.png](https://i-blog.csdnimg.cn/blog_migrate/e83f916aff797929cf4e99f7bc0cb587.jpeg)
这样可以用下面的办法解决
![391a3cb9ef78d9574ce848a6bbda0875.png](https://i-blog.csdnimg.cn/blog_migrate/5486781b763c62713e9aaa345d0a7cc5.jpeg)
也可以用_(下划线)
![c1e6f930a6eb741079fd50fad7760ce7.png](https://i-blog.csdnimg.cn/blog_migrate/b28a5b912c65e7885a59f341c640f083.jpeg)
匹配的时候是从下往上匹配的,所以我们改动下代码
![6aa3e7589b5e8e84f8e908d47a0d0349.png](https://i-blog.csdnimg.cn/blog_migrate/842520fc41796eb79d19257436f2c688.jpeg)
对类型进行匹配
![7c05eeaf1fe2241ad645ae557d2a79e6.png](https://i-blog.csdnimg.cn/blog_migrate/11d5cc8595abf667737ee276743d8863.jpeg)
运行结果
![db3f23853afaa4c7ce36410dd971f916.png](https://i-blog.csdnimg.cn/blog_migrate/8a01be0b0cc377d188afbdf05e1e0d12.jpeg)
对Array和List元素进行匹配
![06b094f08756feb39516a821b8b072af.png](https://i-blog.csdnimg.cn/blog_migrate/4c4e8520fef07d133f45ac51ee571424.jpeg)
对case class进行匹配
![9cd20b9bab39a6fa8552e1beb9b4dd51.png](https://i-blog.csdnimg.cn/blog_migrate/c2e012ac76071cfcf13bb8a2d8592800.jpeg)
![a90e6ad5c604ff88683ef49cba866136.png](https://i-blog.csdnimg.cn/blog_migrate/37959dd3bc47e0a9ff7b3d481593844b.jpeg)
对有值或没值进行匹配(Option)
![7ba8bd52ff48f54af33fcfbc8e813919.png](https://i-blog.csdnimg.cn/blog_migrate/283f813932fbd4d2db1b6a5703f29169.jpeg)
![55dedc4f8e9d32755c005e8eb09e7e68.png](https://i-blog.csdnimg.cn/blog_migrate/b01d77dcdab9621b3bb39b9c6f5737e0.jpeg)
元组
![21b85eb9b0702dda09a669a2d91fe81b.png](https://i-blog.csdnimg.cn/blog_migrate/90df3138fe1f283d035bab8bb2a39f51.jpeg)
scala泛型
基本和Java一样,区别在于:Java使用<>表示泛型,scala使用[]表示泛型
泛型可以出现在class名称后面以及方法名称后面
class Student[T]
def add[T](t:T)
上下界:
[A1 >: A] : 表示A是A1的下界,也就是A是A1的子类
[A1 <: a :>
协变/逆变:
[+T] : 协变,如果有一个类C定义为C[T],而且A是B的父类,那么C[A]是C[B]的父类
![bc17cfc1c5b633dca369c59b7091b495.png](https://i-blog.csdnimg.cn/blog_migrate/6c20c476668e0d95e73c461fc097d847.jpeg)
[-T] : 逆变,如果有一个类C定义为C[T],而且A是B的父类,那么C[B]是C[A]的父类
![af7a5be47cac9a60ef89e754b74d95f3.png](https://i-blog.csdnimg.cn/blog_migrate/29dc2c7a0f9f0115e148f4def4155f2d.jpeg)
[T] : 正常定义,如果有一个类C定义为C[T],而且A是B的父类,那么C[A]和C[B]之间没有关系
![aafb378246481ff316f45b7786f9afb3.png](https://i-blog.csdnimg.cn/blog_migrate/273e7b4125f1991d8ed112e32d873608.jpeg)
隐式转换
注意:隐式转换函数只能转换一次
隐式转换函数
将一个对象通过定义的隐式转换函数转换成为另一个对象,主要在于某一个对象在调用某个方法的时候,
该对象实际上没有该方法,可以通过隐式转换将该对象转换为具有该方法的其他对象(隐式转换函数在当前作用域中存在)
![99fa04b2fc0e19431f3ff870c4ef104a.png](https://i-blog.csdnimg.cn/blog_migrate/f88940c8f3cc5d034d8440fa1ac87c8c.jpeg)