Scala高阶

Posted 碧茂大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala高阶相关的知识,希望对你有一定的参考价值。

更多精彩,请点击上方蓝字关注我们!

Scala高阶

  • Scala高阶技巧

    • 通过类型参数构建类和函数、方法,使之适应不同类型的参数

    • match表达式的高级应用,样例类

    • Scala作为一门“函数式编程语言”,函数是一个值,能被传递和操作

    • 高阶函数

    • 模式匹配

    • 类型参数

1 函数

1.1 头等函数

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

  • Scala高阶


    Scala高阶

1.2 匿名函数(anonymous functions)

  • 不命名的函数

    • (x:Int) => x*2

    • (x1:T1,x2:T2,...) => E

  • 匿名函数的作用域非常小,往往只在参数中使用,其作用范围即是调用该匿名函数参数的函数体

  • Scala高阶

1.3 高阶函数

  • 将其他函数作为参数或其结果是函数的函数

  • 示例:apply()函数接受另一个函数f和值v,并将函数f应用于v

  • Scala高阶

1.4 柯里化函数

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

  • Scala高阶

1.5 闭包

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

  • Scala高阶

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

    • i是函数的一个正式参数

    • factor参考了函数之外的变量,但是在闭合的范围内

    • 函数引用factor,每次读取其当前值

    • 如果函数没有外部引用,那么它本身就会被简单地关闭,不需要外部上下文

2 模式匹配

  • 模式匹配包括一系列备选项,每个替代项以关键字大小写为单位

  • 每个替代方案包括一个模式和一个或多个表达式,如果模式匹配,将会进行评估计算

  • 箭头符号=>将模式与表达式分离

  • 通配符“”表示任意,“*”则表示任意长度

    Scala高阶

2.1 类型匹配

Scala高阶

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

2.2 使用case类匹配

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


    Scala高阶

3 注解

3.1 为什么使用注解

  • 注解是能被编译器或外部工具处理的一些信息

  • 注解是在编译和运行之外,对程序进行的操作

    • 自动生成文档

    • 在生成文档时自动排版

    • 代码的错误检查与忽略

  • 注解的实质是一个标签,插入到代码中标志元编程工具对该段代码使用

  • Java的注解并不影响编译器的运行,但Scala的注解会,如@BeanProperty

  • 可以自行编写新的元编程工具

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]

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

    • def sum[@specialized(Int , Double) T] = { ... }