Scala高阶
Posted 碧茂大数据
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala高阶相关的知识,希望对你有一定的参考价值。
Scala高阶技巧
通过类型参数构建类和函数、方法,使之适应不同类型的参数
match表达式的高级应用,样例类
Scala作为一门“函数式编程语言”,函数是一个值,能被传递和操作
高阶函数
模式匹配
类型参数
1 函数
1.1 头等函数
Scala里的函数是一个“头等函数”(first-class value)。像其他的值,函数可以被当成参数传递,也可以被当成结果返回
1.2 匿名函数(anonymous functions)
不命名的函数
(x:Int) => x*2
(x1:T1,x2:T2,...) => E
匿名函数的作用域非常小,往往只在参数中使用,其作用范围即是调用该匿名函数参数的函数体
1.3 高阶函数
将其他函数作为参数或其结果是函数的函数
示例:apply()函数接受另一个函数f和值v,并将函数f应用于v
1.4 柯里化函数
一个带有多个参数,并引入到一个函数链中的函数,每个函数都使用一个参数
1.5 闭包
闭包是一个函数,它返回值取决于在此函数之外声明的一个或多个变量的值
乘数有两个自由变量:i和factor
i是函数的一个正式参数
factor参考了函数之外的变量,但是在闭合的范围内
函数引用factor,每次读取其当前值
如果函数没有外部引用,那么它本身就会被简单地关闭,不需要外部上下文
2 模式匹配
模式匹配包括一系列备选项,每个替代项以关键字大小写为单位
每个替代方案包括一个模式和一个或多个表达式,如果模式匹配,将会进行评估计算
箭头符号=>将模式与表达式分离
通配符“”表示任意,“*”则表示任意长度
2.1 类型匹配
注意:泛型的类型匹配要注意如List[String]、Map[Char,Int]等不会成功匹配,如List[Int]等亦可匹配,因而往往使用通配符List[ _ ]进行匹配,但Array[Int]是可行的
2.2 使用case类匹配
case类是用于与case表达式进行模式匹配的特殊类。在语法上,这些是带有特殊修饰符的标准类:case,示例:
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] = { ... }
以上是关于Scala高阶的主要内容,如果未能解决你的问题,请参考以下文章