|
我们用过多种偏函数形式:
{case x => x.toString}
也用过:
{case x:Int => x+1}
也用过:
{case Animal(name,age) => ....}
也用过:
存在一个偏函数:val fp: ParitalFunction[Int,Any] = {
case x if(x==1 || x==2) => x.toString
}
将fp用于下面类的主构造参数中
class XXX(f: (a,b,c)=>PartialFunction[Int,Any])
{
def method(x,y,z,arg) {
val g = f(x,y,z)
if(g.isDefinedAt(arg) g.apply(arg)
else "null"
}
特别是下面:
val l1: List[Int]=>Int = { //全部List[Int]类型的所有可能的都是合格的参数
case x :: y :: _ =>y //所以只传参数List(1)则异常
}
val l2: PartialFunction[List[Int],Int] = {
case x :: y :: _ =>y
}
println(l1(List(1,2,3)))
println(l1(List(1,2)))
//println(l1(List(1))) 异常
println(l2(List(1,2)))
if(l2.isDefinedAt(List(5))) println(l2(List(5))) //不会显示 但不会异常 ,如果不用isDefinedAt进行判断直接println(l2(List(5)))则就会异常
else println("not defined at") //只显示这一行
总之,有很多种情况我们都用过了,但不管是哪种使用形式,偏函数有一个终极使用原则意见:
参数类型虽然被确定了,但并不是所有这种类型的参数都可以使用,必须是isDefinedAt返回
值是true的参数才可以调用取得值
|
|