大数据系列修炼-Scala课程61
2016-09-30 09:32
225 查看
大数据系列修炼-Scala课程61
核心内容:
1、Scala中的隐式转换系统与类型系统的联合使用操作代码实战
def biggerT(implicit m:T=>Ordered[T]) = ……的含义:
1>bigger是一个泛型函数,并且是一个柯里化函数,并且函数的第二个参数是一个函数(隐式函数呢)。
2>m是一个隐式参数,这个隐式参数指向一个匿名函数,这个匿名函数的输入是T,输出是Ordered[T]。
即隐式参数本身就是一个匿名函数,完成类型转换的作用。通过隐式转换:将T这种数据类型转化为Ordered[T]这种数据类型,
相当于自动装箱技术,从而first与second可以使用使用Ordered这个特质中的>或者<运算符。
实例程序1:复习scala中的隐式转换与隐式参数
运行结果:
实例程序2:隐式转换与隐式参数结合使用
实例程序3:上面的程序如果不用隐式转换,可以用之前的知识写:
深度思考1:在(implicit f:T=>Ordered[T])中,f拥有两种角色:既是参数,又是函数,所以这是一个隐式参数与隐式函数(隐式视图)的结合。
如有问题,欢迎留言指正!
核心内容:
1、Scala中的隐式转换系统与类型系统的联合使用操作代码实战
1、Scala中的隐式转换系统与类型系统的联合使用操作代码实战 |
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拥有两种角色:既是参数,又是函数,所以这是一个隐式参数与隐式函数(隐式视图)的结合。
如有问题,欢迎留言指正!
相关文章推荐
- 大数据系列修炼-Scala课程10
- 大数据系列修炼-Scala课程45
- 大数据系列修炼-Scala课程84
- 大数据系列修炼-Scala课程87
- 大数据系列修炼-Scala课程17
- 大数据系列修炼-Scala课程33
- 大数据系列修炼-Scala课程74
- 大数据系列修炼-Scala课程77
- 大数据系列修炼-Scala课程80
- 大数据系列修炼-Scala课程88
- 大数据系列修炼-Scala课程34
- 大数据系列修炼-Scala课程04
- 大数据系列修炼-Scala课程78
- 大数据系列修炼-Scala课程20
- 大数据系列修炼-Scala课程41
- 大数据系列修炼-Scala课程76
- 大数据系列修炼-Scala课程83
- 大数据系列修炼-Scala课程96(1)
- 大数据系列修炼-Scala课程25
- 大数据系列修炼-Scala课程29