大数据-scala(十三)

                                   大数据-scala(十三)

隐式转换和隐式参数

隐式转换

Scala提供的隐式转换和隐式参数功能,是非常有特色的功能。是Java等编程语言所没有的功能。它可以允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法。通过这些功能,可以实现非常强大、特殊的功能。

隐式转换其核心就是定义一个使用 implicit 关键字修饰的方法 实现把一个原始类转换成目标类,进而可以调用目标类中的方法。

隐式参数

所谓的隐式参数,指的是在函数或者方法中,定义一个用implicit修饰的参数,此时Scala会尝试找到一个指定类型的用implicit修饰的参数,即隐式值,并注入参数。

所有的隐式转换和隐式参数必须定义在一个object中。

案例演示

案例一:让File类具备RichFile类中的read方法

package com.kaikeba.implic_demo

import java.io.File

import scala.io.Source

//todo:隐式转换案例一:让File类具备RichFile类中的read方法

object MyPredef{
  //定义一个隐式转换的方法,实现把File转换成RichFile
  implicit  def file2RichFile(file:File)=new RichFile(file)

}

class RichFile(val file:File){
     //读取数据文件的方法
    def read():String={
       Source.fromFile(file).mkString
    }
}

object RichFile{
  def main(args: Array[String]): Unit = {
     //1、构建一个File对象
          val file = new File("E:\\aa.txt")

     //2、手动导入隐式转换
      import MyPredef.file2RichFile

       val data: String = file.read
        println(data)
  }
}

案例二:超人变身

package com.kaikeba.implic_demo

//todo:隐式转换案例二:超人变身
class Man(val name:String)

class SuperMan(val name: String) {
  def heat=print("超人打怪兽")

}

object SuperMan{
  //隐式转换方法
  implicit def man2SuperMan(man:Man)=new SuperMan(man.name)

  def main(args: Array[String]) {
      val hero=new Man("hero")
      //Man具备了SuperMan的方法
      hero.heat
  }

}

案例三:一个类隐式转换成具有相同方法的多个类

package com.kaikeba.implic_demo

//todo:隐式转换案例三(一个类隐式转换成具有相同方法的多个类)

class C
class A(c:C) {
    def readBook(): Unit ={
      println("A说:好书好书...")
    }
}

class B(c:C){
  def readBook(): Unit ={
    println("B说:看不懂...")
  }
  def writeBook(): Unit ={
    println("B说:不会写...")
  }
}

object AB{

  //创建一个类转换为2个类的隐式转换
  implicit def C2A(c:C)=new A(c)
  implicit def C2B(c:C)=new B(c)
}

object B{
  def main(args: Array[String]) {
    //导包
    //1. import AB._ 会将AB类下的所有隐式转换导进来
    //2. import AB.C2A 只导入C类到A类的的隐式转换方法
    //3. import AB.C2B 只导入C类到B类的的隐式转换方法
    import AB._
    val c=new C

    //由于A类与B类中都有readBook(),只能导入其中一个,否则调用共同方法时代码报错
     //c.readBook()

    //C类可以执行B类中的writeBook()
    c.writeBook()

  }
}

案例四:员工领取薪水

package com.kaikeba.implic_demo

//todo:隐式参数案例四:员工领取薪水

object Company{
  //在object中定义隐式值    注意:同一类型的隐式值只允许出现一次,否则会报错
  implicit  val xxx="zhangsan"
  implicit  val yyy=10000.00

  //implicit  val zzz="lisi"

}

class Boss {
  //定义一个用implicit修饰的参数 类型为String
  //注意参数匹配的类型   它需要的是String类型的隐式值
  def callName(implicit name:String):String={
    name+" is coming !"
  }

  //定义一个用implicit修饰的参数,类型为Double
  //注意参数匹配的类型    它需要的是Double类型的隐式值
  def getMoney(implicit money:Double):String={
    " 当月薪水:"+money
  }


}

object Boss extends App{
  //使用import导入定义好的隐式值,注意:必须先加载否则会报错
  import Company.xxx
  import Company.yyy

  val boss =new Boss
  println(boss.callName+boss.getMoney)

}

此博文仅供学习参考,如有错误欢迎指正。

上一篇《大数据-scala(十二)

下一篇《大数据-Spark(一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验7中,我们学习到了如何使用Spark来进行编程实践,其中使用的是Scala语言。Spark是一个开源的分布式计算框架,它可以高效地处理大规模的数据集。 在实验中,我们首先学习了Spark的基本概念和架构。Spark使用了RDD(弹性分布式数据集)作为其核心数据结构,可以将数据集分布在集群的多个节点上,并通过并行计算来进行高效处理。我们还了解了Spark的运行模式,包括本地模式和集群模式,并学习了如何设置和配置Spark的运行环境。 接着,我们学习了使用Scala语言编写Spark应用程序的方法。Scala是一种功能强大的静态类型编程语言,它可以与Java无缝集成,并且提供了很多简化编程的特性。我们学习了如何使用Scala的函数式编程特性来编写Spark应用程序,并通过实例演示了如何加载数据、转换数据以及进行数据分析和计算。 在实验中,我们还学习了Spark的常见操作和转换,包括map、reduce、filter、join等。这些操作可以帮助我们对数据进行各种复杂的计算和处理,而无需编写繁琐的循环和条件判断。我们还学习了如何使用Spark的持久化机制来优化计算性能,包括将数据缓存到内存中和将数据持久化到磁盘上。 最后,我们在实验中使用了Spark进行了几个实际的编程练习。通过这些练习,我们学习了如何在Spark中加载和处理不同类型的数据,包括文本数据、CSV文件和JSON数据。我们还学习了如何使用Spark进行数据清洗、数据转换和数据分析,并学习了如何使用Spark的机器学习库来进行简单的机器学习任务。 总的来说,实验7是一个非常实用和综合的实验,通过学习和实践,我们对Spark编程有了更深入的了解和掌握。同时,我们也学习到了如何使用Scala语言来编写高效的分布式计算程序。这些知识和技能对于我们在实际工作中处理大数据和进行分布式计算非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值