大数据系列修炼-Scala课程59
2016-09-29 08:08
288 查看
大数据系列修炼-Scala课程59
核心内容:
1、Scala中隐式转换初体验实战详解以及隐式转换在Spark中的应用源码解析
1>Scala中的隐式转换本质上相当于C语言中的强制类型转换以及Java中的自动装箱技术的应用扩展
2>Scala中隐式转换的由来:我们想使用某一个类(B)中的特殊的方法,但是自身类(A)又没有提供这样的一个方法,通过隐式转换,
可以将自身类(A)的类型转换成提供相应方法的类(B)的类型,进而调动相应的方法。
3>隐式转换本身可以把一个类的实例当做另外一个类的实例来使用,从使用者的角度而言,使用者使用的还是当前自己的类,但是这个
类却拥有了额外的一些方法。
4>隐式转换的完成需要两个条件:
(1)首先必须有一个增强的类,在这类中含有我们需要的方法
(2)通过隐式转换函数将已有的类型转换为增强的类型
5>隐式转换函数的命名一般这样写:前面是转换前的类型,后面是增强的(转换后)类类型 :如 int2Integer
6>在隐式方法中,函数的参数就是转换前的类的实例,函数体的执行体就是创建一个增强类对象
7>隐式转换中:增强类的主构造器的参数类型一般是转换前的类的类型,即增强类一般是增强已有的类,并且增强类中含有我们
想要的方法。
8>Scala中的Predef类含有很多隐式转换的内容,比如说将Int类型通过隐式转换自动转换为Integer类型
9>在隐式转换的作用域查找中,如果当前作用域没有隐式转换,编译器会到相应源或目标类型的伴生对象中查找隐式转换。
10>Scala一次至多只能应用一个隐式转换,如果说编译器在当前范围内寻找到了隐式转换的方式,编译器就不会向外找了。
实例程序1:没有通过隐式函数进行的程序编程
实例程序2:通过隐式转换与隐式函数进行的程序编程
上面两个程序的运行结果都是:
实例程序3:自己编写的一个隐式转换程序
深度思考1:深度总结
①Scala提供了两种隐式转换的机制:
第一种隐式转换的机制:隐式值:隐式值可以给方法提供参数。
第二种隐式转换的机制:隐式视图:隐式视图是指把一种类型自动转换到另外一种类型,以符合表达式的要求,或使针对某类型的方法的调用能够成功。
②隐式视图的定义一般用如下形式:
其中隐式转换函数的命名一般这样写:前面是转换前的类型,后面是增强后的类型。
隐式视图的参数一般是转换前的类型,执行体一般是增强类的实例对象。
隐式视图的作用:如果在隐式作用域里存在这个定义,它会隐式地把OriginalType类型的值转换为ViewType类型的值(在需要的时候)。
隐式视图常用于增强已存在的类。
③隐式转换即隐式绑定可能所处的位置:
1>所有关联类型即目标类型的伴生对象,包括包对象:Scala会到关联类型的伴生对象中去寻找隐式绑定。
2>Scala.Predef对象:每个编译后的Scala文件的开头都有一句:implicit import scala.Predef._ .Predef头文件中包含很多有用的隐式转换方法。
3>作用域类所有导入语句:即最后一个隐式转换可能存在的位置是源代码里明确的import 导入语句。(这种方式要小心对待)
深度思考2:Java中的继承与Scala中的隐式转换都是一种增强类库的方式,既然学习了Scala中的隐式转换,你就应该努力使用它解决问题。
如有问题,欢迎留言指正!
核心内容:
1、Scala中隐式转换初体验实战详解以及隐式转换在Spark中的应用源码解析
1、Scala中隐式转换初体验操作代码实战 |
2>Scala中隐式转换的由来:我们想使用某一个类(B)中的特殊的方法,但是自身类(A)又没有提供这样的一个方法,通过隐式转换,
可以将自身类(A)的类型转换成提供相应方法的类(B)的类型,进而调动相应的方法。
3>隐式转换本身可以把一个类的实例当做另外一个类的实例来使用,从使用者的角度而言,使用者使用的还是当前自己的类,但是这个
类却拥有了额外的一些方法。
4>隐式转换的完成需要两个条件:
(1)首先必须有一个增强的类,在这类中含有我们需要的方法
(2)通过隐式转换函数将已有的类型转换为增强的类型
5>隐式转换函数的命名一般这样写:前面是转换前的类型,后面是增强的(转换后)类类型 :如 int2Integer
6>在隐式方法中,函数的参数就是转换前的类的实例,函数体的执行体就是创建一个增强类对象
7>隐式转换中:增强类的主构造器的参数类型一般是转换前的类的类型,即增强类一般是增强已有的类,并且增强类中含有我们
想要的方法。
8>Scala中的Predef类含有很多隐式转换的内容,比如说将Int类型通过隐式转换自动转换为Integer类型
9>在隐式转换的作用域查找中,如果当前作用域没有隐式转换,编译器会到相应源或目标类型的伴生对象中查找隐式转换。
10>Scala一次至多只能应用一个隐式转换,如果说编译器在当前范围内寻找到了隐式转换的方式,编译器就不会向外找了。
实例程序1:没有通过隐式函数进行的程序编程
class RichFile(val file:File) { def read() = Source.fromFile(file.getPath()).mkString } object Context { def file2RichFile(file:File) = new RichFile(file) } object App6 { def main(args:Array[String]):Unit= { //下面这行代码显示的调用了file2RichFile这个方法 println(Context.file2RichFile(new File("C:\\word.txt")).read()) } }
实例程序2:通过隐式转换与隐式函数进行的程序编程
class RichFile(val file:File) { def read() = Source.fromFile(file.getPath()).mkString } object Context { implicit def file2RichFile(file:File) = new RichFile(file) } object App6 { def main(args:Array[String]):Unit= { import Context.file2RichFile val aa = new File("C:\\word.txt") //下面这行代码显示的调用了file2RichFile这个方法 println(aa.read()) } }
上面两个程序的运行结果都是:
hello she hello he hello me hello she
实例程序3:自己编写的一个隐式转换程序
class Persion(val stu:Student) { def fun() = println("I am a persion!") } class Student object Context { implicit def g(stu:Student) = new Persion(stu) } object App6 { def main(args:Array[String]):Unit= { val aa = new Student import Context.g aa.fun() //本行语句实际上相当于Context.g(aa).fun() } } /* * 运行结果: * I am a persion! * */
深度思考1:深度总结
①Scala提供了两种隐式转换的机制:
第一种隐式转换的机制:隐式值:隐式值可以给方法提供参数。
第二种隐式转换的机制:隐式视图:隐式视图是指把一种类型自动转换到另外一种类型,以符合表达式的要求,或使针对某类型的方法的调用能够成功。
②隐式视图的定义一般用如下形式:
其中隐式转换函数的命名一般这样写:前面是转换前的类型,后面是增强后的类型。
隐式视图的参数一般是转换前的类型,执行体一般是增强类的实例对象。
隐式视图的作用:如果在隐式作用域里存在这个定义,它会隐式地把OriginalType类型的值转换为ViewType类型的值(在需要的时候)。
隐式视图常用于增强已存在的类。
③隐式转换即隐式绑定可能所处的位置:
1>所有关联类型即目标类型的伴生对象,包括包对象:Scala会到关联类型的伴生对象中去寻找隐式绑定。
2>Scala.Predef对象:每个编译后的Scala文件的开头都有一句:implicit import scala.Predef._ .Predef头文件中包含很多有用的隐式转换方法。
3>作用域类所有导入语句:即最后一个隐式转换可能存在的位置是源代码里明确的import 导入语句。(这种方式要小心对待)
深度思考2:Java中的继承与Scala中的隐式转换都是一种增强类库的方式,既然学习了Scala中的隐式转换,你就应该努力使用它解决问题。
如有问题,欢迎留言指正!
相关文章推荐
- 大数据系列修炼-Scala课程07
- 大数据系列修炼-Scala课程72
- 大数据系列修炼-Scala课程106
- 大数据系列修炼-Scala课程28
- 大数据系列修炼-Scala课程09
- 大数据系列修炼-Scala课程107
- 大数据系列修炼-Scala课程02
- 大数据系列修炼-Scala课程03
- 大数据系列修炼-Scala课程05
- 大数据系列修炼-Scala课程85
- 大数据系列修炼-Scala课程12
- 大数据系列修炼-Scala课程15
- 大数据系列修炼-Scala课程108
- 大数据系列修炼-Scala课程36
- 大数据系列修炼-Scala课程37
- 大数据系列修炼-Scala课程45
- 大数据系列修炼-Scala课程01
- 大数据系列修炼-Scala课程90
- 大数据系列修炼-Scala课程109
- 大数据系列修炼-Scala课程38