Scala入门(四) 高级特性

高阶函数

Scala 混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数

  • 作为值的函数

    val arr = Array(1,2,3,4)
    val f1  = (x:Int) => x*2
    arr.map(f1)//Array(2,4,6,8)
    
  • 匿名函数

    arr.map((x:Int)=>x*2)//Array(2,4,6,8)
    arr.map(x=>x*2)//Array(2,4,6,8)
    arr.map(_*2)//Array(2,4,6,8)
    
  • 柯里化

    • 柯里化(Currying)指的是把原来接受多个参数的函数变换成接受一个参数的函数过程,并且返回接受余下的参数且返回结果为一个新函数的技术。
    • scala 柯里化风格的使用可以简化主函数的复杂度,提高主函数的自闭性,提高功能上的可扩张性、灵活性。可以编写出更加抽象,功能化和高效的函数式代码。
    //定义一个方法, 方法有一个Int参数,方法体是一个函数
    def m(x:Int)=(y:Int)=>x*y
    //调用方法传入Int参数返回一个函数
    val f=m(3)
    //调用函数,返回结果
    val v=f(5)   //15
    
    //简写
    def m(x:Int)(y:Int)=x*y
    //调用
    val v=m(3)(5)  //15
    //当你调用 m(3)(5)时,实际上是依次调用两个普通函数(非柯里化函数),
    //第一次调用使用一个参数 x,返回一个函数类型的值,
    //第二次使用参数 y 调用这个函数类型的值。
    
    //也可以使用下划线“_” 作为第二参数列表的占位符, 这个定义的返回值为一个函数,
    //当调用时会给调用的参数加一。
    val f=m(3)_
    val v=f(5)   //15
    
  • 闭包

    • 闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量。
    • 闭包通常来讲可以简单的认为是可以访问不在当前作用域范围内的一个函数。
    val y=10
    val add=(x:Int)=>{
        // 然而,y 不是形式参数,而是自由变量
        x+y
    }
    val v=add(5)//15
    

隐式转换和隐式参数

隐式转换

​ 允许你手动指定,将某种类型的对象转换成其他类型的对象或者是给一个类增加方法

​ Scala 的隐式转换,其实最核心的就是定义隐式转换方法,即 implicitconversion function。定义的隐式转换方法,只要在编写的程序内引入,就会被Scala 自动使用。Scala 会根据隐式转换方法的签名,在程序中使用到隐式转换方法接收的参数类型定义的对象时,会自动将其传入隐式转换方法,转换为另外一种类型的对象并返回。这就是“隐式转换”。其中所有的隐式值和隐式方法必须放到 object 中。

  • implicit 关键字只能用来修饰方法、变量(参数)。
  • 隐式转换的方法在当前范围内才有效。如果隐式转换不在当前范围内定义比如定义在另一个类中或包含在某个对象中),那么必须通过 import 语句将其导入
隐式参数

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

Scala 会在两个范围内查找:

  • 当前作用域内可见的 val 或 var 定义的隐式变量
  • 一种是隐式参数类型的伴生对象内的隐式值
隐式转换方法作用域与导入

Scala 默认会使用两种隐式转换,一种是源类型或者目标类型的伴生对象内的隐式转换方法;一种是当前程序作用域内的可以用唯一标识符表示的隐式转换方法。
如果隐式转换方法不在上述两种情况下的话,那么就必须手动使用import 语法引入某个包下的隐式转换方法,比如 import test._。通常建议,仅仅在需要进行隐式转换的地方,用 import 导入隐式转换方法,这样可以缩小隐式转换方法的作用域,避免不需要的隐式转换。

隐式转换的时机
  • 当对象调用类中不存在的方法或成员时,编译器会自动将对象进行隐式转换
  • 当方法中的参数的类型与目标类型不一致时
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
  }

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

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._
    
  val boss =new Boss
  println(boss.callName()+boss.getMoney())
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章,“可伸展的语言”,给出了Scala的设计,和它后面的理由,历史的概要。 第2章,“Scala的第一步”,展示给你如何使用Scala完成若干种基本编程任务,而不牵涉过多关于如何工作的细节。本章的目的是让你的手指开始敲击并执行Scala代码。 第3章,“Scala的下一步”,演示更多的基本编程任务来帮助你更快速地上手Scala。本章之后,你将能够开始在简单的脚本任务中使用Scala。 第4章,“类和对象”,通过描述面向对象语言的基本建设模块和如何编译及运行Scala程序的教程开始有深度地覆盖Scala语言。 第5章,“基本类型和操作”,覆盖了Scala的基本类型,它们的文本,你可以执行的操作,优先级和关联性是如何工作的,还有什么是富包装器。 第6章,“函数式对象”,进入了Scala面向对象特征的更深层次,使用函数式(即,不可变)分数作为例子。 第7章,“内建控制结构”,显示了如何使用Scala的内建控制结构,如,if,while,for,try和match。 第8章,“函数和闭包”,深度讨论了函数式语言的基础建设模块,函数。 ...... 第31章,“组合子解析”,显示了如何使用Scala的解析器组合子库来创建解析器。 第32章,“GUI编程”,展示了使用Scala库简化基于Swing的GUI编程的快速旅程。 第33章,“SCell电子表”,通过展示一个完整的电子表的实现,集中演示了Scala的一切。
上百节课详细讲解,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 本课程主要讲解的内容包括:Scala编程、Hadoop与Spark集群搭建、Spark核心编程、Spark内核源码深度剖析、Spark性能调优、Spark SQL、Spark Streaming。 本课程的最大特色包括: 1、代码驱动讲解Spark的各个技术点(绝对不是照着PPT空讲理论); 2、现场动手画图讲解Spark原理以及源码(绝对不是干讲源码和PPT); 3、覆盖Spark所有功能点(Spark RDD、Spark SQL、Spark Streaming,初级功能到高级特性,一个不少); 4、Scala全程案例实战讲解(近百个趣味性案例); 5、Spark案例实战的代码,几乎都提供了Java和Scala两个版本和讲解(一次性同时精通Java和Scala开发Spark); 6、大量全网唯一的知识点:基于排序的wordcount,Spark二次排序,Spark分组取topn,DataFrame与RDD的两种转换方式,Spark SQL的内置函数、开窗函数、UDF、UDAF,Spark Streaming的Kafka Direct API、updateStateByKey、transform、滑动窗口、foreachRDD性能优化、与Spark SQL整合使用、持久化、checkpoint、容错与事务。 7、多个从企业实际需求抽取出的复杂案例实战:每日uv和销售额统计案例、top3热卖商品统计案例、每日top3热点搜索词统计、广告计费日志实时黑名单过滤案例、热点搜索词滑动统 计案例、top3热门商品实时统计案例 8、深度剖析Spark内核源码与Spark Streaming源码,给源码进行详细的注释和讲解(史上最细致源码讲解) 9、全面讲解Spark、Spark SQL、Spark Streaming的性能调优,其中包括全网唯一的Shuffle性能调优(详细讲解性能调优的各个技术点) 10、涵盖Spark两个重要版本,Spark 1.3.0和Spark 1.5.1的讲解(走在Spark最前沿,涵盖最新高级特性) 一、Scala编程详解 二、课程环境搭建 三、Spark核心编程 、Spark内核源码深度剖析 五、Spark性能优化 六、Spark SQL 七、Spark Streaming

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值