6.Scala高阶

  • Scala高阶技巧
    • 高阶函数
      • Scala作为一门“函数式编程语言”,函数是一个值,能被传递和操作
    • 模式匹配
      • match表达式的高级应用,样例类
    • 类型参数
      • 通过类型参数构建类和函数、方法,使之适应不同类型的参数

6.1 函数

6.1.1 头等函数

  • Scala里的函数是一个“头等函数”(first-class value)。像其他的值,函数可以被当成参数传递,也可以被当成结果返回



6.1.2 匿名函数(anonymous functions)

  • 不命名的函数
    • (x:Int) => x*2
    • (x1:T1,x2:T2,...) => E
  • 匿名函数的作用域非常小,往往只在参数中使用,其作用范围即是调用该匿名函数参数的函数体


6.1.3 高阶函数

  • 将其他函数作为参数或其结果是函数的函数
  • 示例:apply()函数接受另一个函数f和值v,并将函数f应用于v


6.1.4 柯里化函数

  • 一个带有多个参数,并引入到一个函数链中的函数,每个函数都使用一个参数


6.1.5 闭包

  • 闭包是一个函数,它返回值取决于在此函数之外声明的一个或多个变量的值


  • 乘数有两个自由变量:i和factor

    • i是函数的一个正式参数
    • factor参考了函数之外的变量,但是在闭合的范围内
    • 函数引用factor,每次读取其当前值
    • 如果函数没有外部引用,那么它本身就会被简单地关闭,不需要外部上下文

6.2 模式匹配

  • 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位
  • 每个替代方案包括一个模式和一个或多个表达式,如果模式匹配,将会进行评估计算
  • 箭头符号=>将模式与表达式分离
  • 通配符“”表示任意,“*”则表示任意长度

6.2.1 类型匹配

  • 注意:泛型的类型匹配要注意如List[String]、Map[Char,Int]等不会成功匹配,如List[Int]等亦可匹配,因而往往使用通配符List[ _ ]进行匹配,但Array[Int]是可行的

6.2.2 使用case类匹配

  • case类是用于与case表达式进行模式匹配的特殊类。在语法上,这些是带有特殊修饰符的标准类:case,示例:


6.3 注解

6.3.1 为什么使用注解

  • 注解是能被编译器或外部工具处理的一些信息
  • 注解是在编译和运行之外,对程序进行的操作
    • 自动生成文档
    • 在生成文档时自动排版
    • 代码的错误检查与忽略
  • 注解的实质是一个标签,插入到代码中标志元编程工具对该段代码使用
  • Java的注解并不影响编译器的运行,但Scala的注解会,如@BeanProperty
  • 可以自行编写新的元编程工具

6.3.2 注解语法

  • Scala可以为任意的结构代码甚至是参数添加注解
    • @deprecated def Sum() = { ... } //为方法添加注解
    • @deprecated class IntStack { ... } //为类添加注解
    • def check(@NotNull password:String) //为参数添加注解
  • Scala支持多注解,且注解次序没有影响
    • @BeanProperty @Id var username = _
  • 部分注解需要引入参数,Scala支持任意类型作为注解参数
    • @Test( timeout = 100 ) def testA() = { ... }
  • 给主构造器添加注解时,需要将注解放置在构造器之前,并加上一对圆括号
    • class Credentials @Inject() (var username: String, var password: String)
  • 为表达式添加注解,在表达式后加上冒号,然后是注解
    • (myMap.get(key): @unchecked) match { ... }
  • 为类型参数添加注解
    • class MyContainer[@specialized T]
  • 针对实际类型的注解应放置在类型名称之后
    • String @cps[Unit]

6.3.3 注解示例

  • Scala拥有若干个标准注解
  • 废弃@deprecated
    • 标示某段代码(方法或类)不提倡使用,调用该段代码将会收到废弃警告
  • 易变字段@volatile
    • 标示相关变量将会被多个线程使用,使得多线程访问具有预见性
  • 自动的get/set方法对@scala.reflect.BeanProperty
    • 添加该注解将会在编译时自动产生对应的get/set方法,注意不能在同一时间编译的代码中调用注解字段的get/set方法
  • 不检查@unchecked
  • 生成跳转表@switch
    • (m : @switch) match {
    • case 0 => ...
    • case 1 => ...
    • case 2 => ... }
  • 基本类型特殊化@specialized
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容