高阶函数
模式匹配
类型参数
Scala作为一门“函数式编程语言”,函数是一个值,能被传递和操作
头等函数
函数是一个值,在Scala中,函数能作为参数进行传递,函数能调用满足参数要求的不同的函数作为参数
匿名函数
不命名的函数,匿名函数的作用域非常小,往往只在参数中使用,其作用范围即是调用该匿名函数参数的函数体
柯里化
柯里化是指将接受两个参数的函数变成新的接受一个参数的函数的过程
控制抽象
match表达式的高级应用,样例类
模式匹配
数据结构包括各种集合,类,函数等
通配符“_”表示任意,“_*”则表示任意长度,
通配符“_”表示任意,“_*”则表示任意长度,
类型匹配
泛型的类型匹配要注意如List[String]、Map[Char,Int]等不会成功匹配,如List[Int]等亦可匹配,因而往往使用通配符List[ _ ]进行匹配,但Array[Int]是可行的
样例类
封闭类
模式匹配完成后需要确保所有情况皆被考虑
Scala编译器会检测match表达式所遗漏的模式组合
使样本类的超类被封闭(sealed),封闭类除类定义文件外不能添加子类
Scala编译器会检测match表达式所遗漏的模式组合
使样本类的超类被封闭(sealed),封闭类除类定义文件外不能添加子类
warning : match is not exhaustive 添加注解 (a: @unchecked)
偏函数
限定输入参数的值的函数
把函数应用到其不支持的值时,产生运行异常
PartialFunction[A,B],Scala包中给出的部分函数类型
PartialFunction可以使用orElse组成新的函数
把参数模式匹配
把函数应用到其不支持的值时,产生运行异常
PartialFunction[A,B],Scala包中给出的部分函数类型
PartialFunction可以使用orElse组成新的函数
通过类型参数构建类和函数、方法,使之适应不同类型的参数
泛型
类、特质、函数、方法可带有类型参数
当类型被指定的时候构成具体的类、函数等
支持类型推断
类型变量界限
对于泛型结构,类型参数界限能限制应用在该泛型上的类型
Ordered[T]:Scala标准库中提供的一个特质,用以表示可比较的类型
可以通过自行构建的类混入Ordered特质使之符合参数界限(能比较)
类型参数上界实则通过限制类型必须拥有某些特质
Ordered[T]:Scala标准库中提供的一个特质,用以表示可比较的类型
可以通过自行构建的类混入Ordered特质使之符合参数界限(能比较)
类型参数上界实则通过限制类型必须拥有某些特质
视界限定
类型参数下界
上下文界定
T : M //M[T]是在源码中定义的另一个泛型类
多重界定
T >: lower <:upper //同时有上下界,但不能同时有多个上界或下界
T <: Ordered[T] with Cloneable//能要求同时混入多个特质
T <% Ordered[T] <% String//能同时多个视图限定
T : Ordering : Manifest//能同时多个上下文界定
类型约束
T : M //M[T]是在源码中定义的另一个泛型类
多重界定
T >: lower <:upper //同时有上下界,但不能同时有多个上界或下界
T <: Ordered[T] with Cloneable//能要求同时混入多个特质
T <% Ordered[T] <% String//能同时多个视图限定
T : Ordering : Manifest//能同时多个上下文界定
类型约束
T =:= U T和U类型一致
T<:< U T是U的子类
T <%< U T必须能够隐式转换为U
使用类型约束需添加(implicit ev: T <:< U)
型变(协变与逆变)
Stack[School]与Stack[Student]没有任何关系,是两个独立的类
class Stack[+T] +号意味着Stack与T是协变的,Stack与T朝着同样的方向型变
Stack[Student]extends Stack[School]
class Stack[-T] -号意味着Stack与T是逆变的,Stack与T朝着相反的方向型变
Stack[School]extends Stack[Student]
注意:泛型的类型声明中可以同时使用协变和逆变
class Stack[+T] +号意味着Stack与T是协变的,Stack与T朝着同样的方向型变
Stack[Student]extends Stack[School]
class Stack[-T] -号意味着Stack与T是逆变的,Stack与T朝着相反的方向型变
Stack[School]extends Stack[Student]
注意:泛型的类型声明中可以同时使用协变和逆变