大数据技术之_16_Scala学习_09
第十三章 函数式编程-高级
13.1 偏函数(partial function)
13.1.1 提出一个需求,引出思考
给你一个集合 val list = List(1, 2, 3, 4, “abc”),请完成如下要求:
1、将集合 list 中的所有数字 +1,并返回一个新的集合。
2、要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)。
13.1.2 解决方式-filter + map 返回新的集合
13.1.3 解决方式-模式匹配
两种方式的示例代码如下:
示例代码如下:
package com.atguigu.chapter13
/**
* 给你一个集合 val list = List(1, 2, 3, 4, "abc"),请完成如下要求:
* 1、将集合 list 中的所有数字 +1,并返回一个新的集合。
* 2、要求忽略掉 非数字 的元素,即返回的 新的集合 形式为 (2, 3, 4, 5)。
*/
object PartialFunDemo01 {
def main(args: Array[String]): Unit = {
// 思路1:filter + map 方式解决
// 虽然可以解决问题,但是麻烦。
val list = List(1, 2, 3, 4, "abc")
// 先过滤,再map
list.filter(f1)
println(list.filter(f1).map(f2).map(f3)) // List(2, 3, 4, 5)
// 思路2:模式匹配
// 小结:虽然使用模式匹配比较简单,但是不够完美。
val list2 = list.map(addOne2)
println(list2) // List(2, 3, 4, 5, ())
}
// 模式匹配
def addOne2(i: Any): Any = {
i match {
case x:Int => x + 1
case _ =>
}
}
// 将 List 转为 Any
def f1(n: Any): Boolean = {
n.isInstanceOf[Int]
}
// 将 Any 转为 Int [map]
def f2(n: Any): Int = {
n.asInstanceOf[Int]
}
def f3(n: Int): Int = {
n + 1
}
}
输出结果如下:
List(2, 3, 4, 5)
List(2, 3, 4, 5, ())
13.1.4 偏函数的基本介绍
13.1.5 偏函数的快速入门
示例代码如下:
package com.atguigu.chapter13
object PartialFunDemo02 {
def main(args: Array[String]): Unit = {
// 使用偏函数解决
val list = List(1, 2, 3, 4, "hello")
// 定义一个偏函数
// 1. PartialFunction[Any, Int] 表示偏函数接收的参数类型是 Any,返回的类型是 Int
// 2. isDefinedAt(x: Any) 如果返回 true,就会去调用 apply 构建对象实例,如果是 false,就过滤
// 3. apply 构造器,对传入的值 + 1,并返回(新的集合)
val addOne3 = new PartialFunction[Any, Int] {
def isDefinedAt(any: Any) = if (any.isInstanceOf[Int]) true else false
def apply(any: Any) = any.asInstanceOf[Int] + 1 // 将 any 显示转换成 Int
}
// 使用偏函数
// 说明:如果是使用偏函数,则不能使用 map,应该使用 collect
// 说明偏函数的执行流程
// 1. 遍历 list 集合的所有元素
// 2. 然后调用 val element = if(partialFun-isDefinedAt(list单个元素)) {partialFun-apply(list单个元素)}
// 3. 每得到一个符合要求的元素 element,放入到新的集合,最后返回
val list3 = list.collect(addOne3)
println(list3) // List(2, 3, 4, 5)
}
}
输出结果如下:
List(2, 3, 4, 5)