- 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
- def sum[@specialized(Int , Double) T] = { ... }
大数据视频推荐:
腾讯课堂
CSDN
大数据语音推荐:
企业级大数据技术应用
大数据机器学习案例之推荐系统
自然语言处理
大数据基础
人工智能:深度学习入门到精通
- def sum[@specialized(Int , Double) T] = { ... }







