开发者学堂课程【Scala 核心编程 - 进阶:偏函数的必要性】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9086
偏函数的必要性
偏函数
1、提出一个需求,引起思考
偏函数(partialfunction)
先看一个需求
给你一个集合 val list = List(1,2,3,4,"abc”),请完成如下要求:
1)将集合 list 中的所有数字+1,并返回一个新的集合
2)要求忽略掉非数字的元素,即返回的新的集合形式为(2,3,4,5)
2、解决方式-map 返回新的集合,引出偏函数
思路1-map+fliter 方式 (先进行一个过滤,然后 map ,比较麻烦)
val list = List(1, 2, 3, 4, "ahc")
//思路1,使用map+fliter的思路
def f1(n:Any): Boolean={
n.islnstancef[Int]
def f2(n:Int): Int ={ n+1}
def f3(n:Any): Int ={ n.aslnstanceOf[Int]
}
val list2 = list.filter(f1).map(f3).map(f2)
println("list2=" + list2)
//写代码演示+问题分析
新建一个文件包叫 chapter13 写下案例 PartialFunDemo01
package com.atguigu.chapter13
/*
给你一个集合val list=List(1,2,3,4,“abc"),请完成如下要求:
将集合list中的所有数字+1,并返回一个新的集合
要求忽略掉非教字的元素,即返回的新集合形式为(2,3,4,5)
*/
object PartialFunDemo θ1 {
def main(args: Array[String]): Unit={
//思路1 filter + map 方式解决
val list = List(1, 2, 3, 4,"hello")
//先过滤,再 map
//list.map(f1)变成list.filter(f1)
println(list.filter(f1))
}
//}def f1 (n:Int):Int={ 类型未知
//n+1跑不起来
def f1(n:Any):Boolean={
n.isInstanceOf[Int]
}
返回为:
D:\program\jdk8\bin\java...
List(1, 2,3,4)
Process finished with exit code θ
package com.atguigu.chapter13
/*
给你一个集合 val list = List(1,2,3,4,“abc”),请完成如下要求:
将集合 list 中的所有数字+1,并返回一个新的集合
要求忽略掉非数字的元素,即返回的新的集合形式为(2,3,4,5)
*/
object PartialFunDemo01{
def main(args: Array[String]):Unit={
//思路1 filter + map 方式解决
//虽然可以解决问题,但是麻烦
val list = List(1,2,3,4,“hello”)
//先过滤,在 map
println(list.filter(f1).map(f3).map(f2))
}
def f1 (n:Any):Boolean = {
If n.isInstanceOf[Int]
//先用 filter + map 方式解决
}
def f2(n:Int):Int={
n+1
//加入 def f2(n:Int):Int={ 不能用
//n+1能用但是println(list.filter(f1).map(f2))报错因为list 泛型
就Any
}
//将 Any→Int[map]偏函数的好处
def f3(n:Any):Int={
n.asInstanceOf[Int]
}
}
返回为:
D:\program\jdk8\bin\java...
List( 2,3,4,5)
Process finished with exit code θ
3、解决方式-map 返回新的集合,引出偏函数
思路2-模式匹配
Def addOne( i : Int):Int={
//不能用
i match {
case_=>_
}
}
val list=List(1,2,3,4,"abc")
val list2=list map(addOne2)
println("list2=" + list2)
改进:
Def addOne2( i :Any):Any={
i match{
case x:Int=>x+1
case_=>
}
}
package com.atguigu.chapter13
/*
给你一个集合val list = List(1,2,3,4,“abc”),请完成如下要求:
将集合 list 中的所有数字+1,并返回一个新的集合
要求忽略掉非数字的元素,即返回的新的集合形式为(2,3,4,5)
*/
object PartialFunDemo01{
def main(args: Array[String]):Unit={
//思路1 filter + map 方式解决
//虽然可以解决问题,但是麻烦
val list = List(1,2,3,4,“hello”)
//先过滤,在 map
println(list.filter(f1).map(f3).map(f2))
//思路2-模式匹配
//小结:虽然使用模式匹配比较简单,但是不够完美
val list2=list.map(addOne2)
println(“list2=”+list2)
//模式匹配,返回一个 Any
def addOne2( i :Any):Any={
//Any→Int会报错
i match{
case x:Int=>x+1
case_=>
}
}
def f1 (n:Any):Boolean = {
If n.isInstanceOf[Int]
//先用 filter + map 方式解决
}
def f2(n:Int):Int={
n+1
}
//将Any→Int[map]
def f3(n:Any):Int={
n.asInstanceOf[Int]
}
}
效果:
D:\program\jdks\bin\java ...
List(2,3,4,5)
list2=List(2,3,4,5,())
Process finished with exit code θ
//出现(),没过滤