2.PartialFunction
2018-12-20 本文已影响0人
丹之
一个PartialFunction[A, B]
类型的函数是一个一元函数,接收一个类型为A的参数,返回类型为B的值。但是X的值域可以不覆盖A的整个值域,可以只覆盖部分的值域。其中isDefinedAt
可以测试是否一个值是否落在了定义的参数值域上。
如果用简单的白话来讲,就是一个PartialFunction
只处理参数的一个子集。
即使对于a:A调用isDefinedAt
返回true, 调用apply(a)
也可能抛出异常,比如:
val f: PartialFunction[Int, Any] = { case _ => 1/0 }
PartialFunction可以选择做一些不在参数值域的操作。
object PartialFunction {
def main(args: Array[String]): Unit = {
val sample = 1 to 10
val isEven: PartialFunction[Int, String] = {
case x if x % 2 == 1 => x+" is even"
}
// the method collect can use isDefinedAt to select which members to collect
val evenNumbers = sample collect isEven
print(evenNumbers)
}
}

它包含其它的一些方法:
- andThen: 对结果进一步处理,isEven.andThen(println)(2)
- applyOrElse: isEven.applyOrElse(1,isOdd)
- compose:和 andThen类似,但是先调用最后一个,再调用第一个。isEven.compose((x:Int) => x+2)(2) //4
- lift:转换成一个正常的函数,isEven.lift(2),返回Option
- orElse: 组合,扩大参数的值域
- runWith:isEven.runWith(println)(2). 等价if(pf isDefinedAt x) { action(pf(x)); true } else false.返回结果类型为(A) ⇒ Boolean,这和andThen不同,andThen返回PartialFunction[A, C]