十一、高阶函数
scala的函数对象是一种特殊的class,即可担当函数计算职责又可以作为变量传递
作为值的函数
object Function04 {
def main(args: Array[String]): Unit = {
val result = sum _ // _ 匹配函数参数列表
println(result)
}
def sum(x: Int, y: Int): Int = x + y
}
作用:
- 调用
- 作为参数传递
匿名函数(略)
参考之前
柯里化函数(略)
带函数参数的函数
object Function05 {
def main(args: Array[String]): Unit = {
val f1 = (x: Int, y: Int) => x + y // 声明匿名函数
val result = sum(1, 2, f1)
println(result) // 3
}
def sum(x: Int, y: Int, f: (Int, Int) => Int) = { // 带函数参数的函数 函数作为值传递
f(x, y)
}
}
参数(类型)推断
// 方式1
val a1 = Array(1, 2, 3, 4)
val f2 = (x: Int) => println(x)
// foreach 遍历方法 参数需要一个函数对象
a1.foreach(f2)
// 方式2
a1.foreach((x) => println(x)) // 函数参数的类型自动推导
// 方式3
a1.foreach(x => println(x)) // 对于只有一个参数的函数,省略参数外围的()
// 方式4
a1.foreach(println(_)) // 参数在 => 右侧出现一次,可以用 _ 替换掉
// 方式5
a1.foreach(println) // 更为简化的写法
一些有用的高阶函数
-
map 映射方法
Array(1, 2, 3, 4, 5).map("*" * _).foreach(println _)
-
filter 过滤方法
(1 to 10).filter(_ % 2 == 0).foreach(println)
-
reduceLeft 从左计算
(1 to 10).filter(_ % 2 == 0).reduceLeft((x,y) => x+y) // 30
-
WordCount(单词计数)
val a1 = Array("Hello Scala", "Hello Hadoop", "Hello Hello Hello") a1.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).map(x => (x._1, x._2.length)).foreach(println)
函数闭包
闭包指在函数体内,可以访问相应作用域内的任何变量,因为它引用到函数外面定义的变量,定义这个函数的过程是将这个自由变量捕获而构成一个封闭的函数。
语法:函数 + 外部变量 = 闭包
如:
var num = 1 // 外部变量
val result = (x: Int) => num + x // 匿名函数引用外部变量,闭包后 多次调用 共享相同的外部变量
println(result(1)) // 1
num += 10
println(result(1)) // 12
// f1 按道理来说 函数对象不能够使用当前类的声明变量
// 函数闭包:可以将当前外部变量 闭包到函数对象中 语法: 函数对象 + 外部变量 = 闭包
// 外部变量是一个共享变量,一旦外部变量值发生变化 会影响到函数对象中的内容