开发者学堂课程【Scala 核心编程 - 进阶:偏函数的快速入门和小结】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9087
偏函数的快速入门和小结
内容介绍:
一、偏函数的基本介绍
二、偏函数快速入门
三、偏函数的小结
一、偏函数的基本介绍
基本介绍
1)在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择(执行某一个函数时,先要满足某个条件)
2)将包在大括号内的一组 case 语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的参数实施计算,超出范围的值会忽略(未必会忽略,这取决于你打算怎样处理)
3)偏函数在 Scala 中是一个特质 PartialFunction(偏函数会继承 PartialFunction )
二、偏函数快速入门
使用偏函数解决前面的问题,【代码演示+说明】
val list = List(1, 2, 3, 4, "abc")
//说明
val addOne3= new PartialFunction[AnyInt]{def isDefinedAt(any:Any) = if(any.isInstanceOf[Int]) true else false
def apply(any: Any)=any.asInstanceOf[Int]+1
}
val list3 = list.collect(addOne3)
println("list3="+list3)//?
写代码:
PartialFunctionDemo02
package com.atguigu.chapter13
object PartialFunDemo02{
def main(args:Array[String]):Unit={
//使用偏函数解决
val list = List(1, 2,3, 4,"hello")
//定义一个偏函数
//点击apply(v1:T1):R
//1. PartialFunction[Any,Int] 表示偏函数接收的参数类型是Any,返回类型是Int
//2. isDefinedAt(x: Any) 如果返回 true ,就回去调用 apply 构建对象实例,如果是 flase ,滤掉
//3. apply 构造器对传入的值 + 1,并返回(新的集合)
val partialFun= new PartialFunction[Any,Int]{
//if x.isInstanceOf[Int] true else false→x.isInstanceOf[Int]
override def isDefinedAt(x: Any) ={
println(“x=”+x)
x.isInstanceOf[Int]
}
override def apply(v1: Any) = {
println(“v1=”+v1)
v1.asInstanceOf[Int] + 1
}
}
//使用偏函数
//说明:
如果是使用偏函数,则不能使用 map ,应该使用 collect , map 没有过滤
//说明一下偏函数的执行流程
//1.遍历 list 所有元素
//2.然后调用 val ele = if(partialFun-isDefinedAt( list 单个元素)){partialFun-apply ( list 单个元素)}
//3.每得到一个 element,放入到新的集合,最后返回
val list2 = list.collect(partialFun)
println(“list2”+list2)
}
}
执行:
D:\program\jdk8\bin\java ...
list2List(2,3,4,5)
Process finished with exit code 0
v1执行效果:
D:\program\jdk8\bin\java ...
x=1
v1=1
x=2
v1=2
x=3
v1=3
x=4
v1=4
X=hello
list2List(2,3,4,5)
Process finished with exit code 0
三、偏函数的小结
val addOne3= new PartialFunction[AnyInt] (
def apply(any:Any) = any.asInstance0f[Int]+1def isDefinedAt(any: Any) = if (any.isInstanceOf[Int]) true else false
}
1)使用构建特质的实现类(使用的方式是 PartialFunction 的匿名子类)
2)PartialFunction 是个特质(看源码)
3)构建偏函数时,参数形式 [Any,Int] 是泛型,第一个表示参数类型,第二个表示返回参数
4)当使用偏函数时,会遍历集合的所有元素,编译器执行流程时先执行 isDefinedAt(),如果为true,就会执行 apply 构建一个新的 Int 对象返回
5)执行 isDefinedAt() 为 false 就过滤掉这个元素,即不构建新的 Int 对象
6) map 函数不支持偏函数,因为 map 底层的机制就是所有循环遍历,无法过滤处理原来集合的元素
7) collect 函数支持偏函数