0%

scala偏函数

scala偏函数

scala提供了一个PartialFunction偏函数的特质,可以对集合进行条件过滤之后操作,相当于filter+map操作,

例如:将某个包含有多种数据类型的集合进行筛选,选出Int类型进行操作

PartialFunction特质中有两个抽象的方法需要进行实现,isDefinedAt方法就是判断元素是否符合条件,只有符合条件的才会去执行apply方法

1
2
3
4
5
6
7
8
9
10
11
// 偏函数的两个泛型,第一个泛型是入参的类型,第二个泛型是返参的类型
def partFun = new PartialFunction[Any,Int] {
// 进行条件过滤,为true的才会执行apply方法
override def isDefinedAt(x: Any): Boolean = {
x.isInstanceOf[Int]
}

override def apply(v1: Any): Int = {
v1.asInstanceOf[Int]*2
}
}

定义了偏函数之后,通过collect来使用偏函数

1
2
3
4
5
val list = List(1,"a",2.5,4.6f,"b",24)

val partList = list.collect(partFun)
// List(2, 48)
println(partList)

由于声明偏函数只需要实现isDefinedAt和apply方法,就类似于模式匹配中的类型匹配,所以声明偏函数可以简写为

1
2
3
4
def partFun1 : PartialFunction[Any,Int] = {
// 使用case类型匹配使得只有Int类型时才会执行
case a:Int => a*2
}