您的位置:首页 > 大数据

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

2016-09-30 09:32 225 查看
大数据系列修炼-Scala课程61

核心内容:

1、Scala中的隐式转换系统与类型系统的联合使用操作代码实战

1、Scala中的隐式转换系统与类型系统的联合使用操作代码实战
def biggerT(implicit m:T=>Ordered[T]) = ……的含义:

1>bigger是一个泛型函数,并且是一个柯里化函数,并且函数的第二个参数是一个函数(隐式函数呢)。

2>m是一个隐式参数,这个隐式参数指向一个匿名函数,这个匿名函数的输入是T,输出是Ordered[T]。

即隐式参数本身就是一个匿名函数,完成类型转换的作用。通过隐式转换:将T这种数据类型转化为Ordered[T]这种数据类型,

相当于自动装箱技术,从而first与second可以使用使用Ordered这个特质中的>或者<运算符。

实例程序1:复习scala中的隐式转换与隐式参数

class Persion(val stu:Student)
{
def fun() = println("I am a persion!")
}
class Student
object StuPer  //在object单例对象中含有相应的隐式函数与隐式参数
{
//构造隐式函数
implicit def fun(stu:Student) = new Persion(stu)  //本行代码对student对象进行了自动装箱
//构造隐式参数
implicit var field:String = "Java"
}
object App
{
def main(args:Array[String]):Unit =
{
val stu = new Student
println("隐式转换之前的输出结果:")
StuPer.fun(stu).fun()
//上面的一行代码由于引入了隐式函数,可以简化成:
import StuPer.fun
println("隐式转换之后的输出结果:")
stu.fun()
def g(str1:String)(implicit str2:String) = println(str1+"\t"+str2)
println("-------------------")
g("Hadoop")("Spark")
import StuPer.field
g("Scala")
}
}


运行结果:

隐式转换之前的输出结果:
I am a persion!
隐式转换之后的输出结果:
I am a persion!
-------------------
Hadoop  Spark
Scala   Java


实例程序2:隐式转换与隐式参数结合使用

object App6
{
def main(args:Array[String]):Unit=
{
//高阶函数的定义:
def fun(f:(Double)=>Double) =  f(0.25)
//柯里化函数的定义:注意:第二个参数是一个匿名函数
def bigger[T](first:T,second:T)(implicit m:T=>Ordered[T]) =
{
if(m(first).>(second)) first else second
}

val aa = bigger[Double](12.0,60.0)  //隐式参数不用显示的被调用,但是如果去除掉了implicit修饰符,又该如何传递呢?
//如何去找这样的一个函数呢?
println(aa)
}
}


实例程序3:上面的程序如果不用隐式转换,可以用之前的知识写:

object App6
{
def main(args:Array[String]):Unit=
{
//用参数的上下界写:此时first与second参数表示为Ordered[T]的子类,相应的就是含有Ordered中的逻辑运算符>或<号
def bigger[T<%Ordered[T]](first:T,second:T)=
{
if(first.>(second)) first else second
}
val bb = bigger[Integer](100,20)
val cc = bigger(100.0,3200.0)
println(bb)  //100
println(cc)  //3200.0
}
}


深度思考1:在(implicit f:T=>Ordered[T])中,f拥有两种角色:既是参数,又是函数,所以这是一个隐式参数与隐式函数(隐式视图)的结合。

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