您的位置:首页 > 大数据

大数据系列修炼-Scala课程59

2016-09-29 08:08 288 查看
大数据系列修炼-Scala课程59

核心内容:

1、Scala中隐式转换初体验实战详解以及隐式转换在Spark中的应用源码解析

1、Scala中隐式转换初体验操作代码实战
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:没有通过隐式函数进行的程序编程

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中的隐式转换,你就应该努力使用它解决问题。

如有问题,欢迎留言指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: