高阶函数
1、以函数作为参数
2、以函数作为返回值
以函数作为参数
def fun1(f: String => Int): Unit = {
//调用传进来的函数
val i: Int = f("100")
println(i)
}
这段代码里面,fun1是一个参数为f,没有返回值的函数
而f是一个参数为String返回值为Int类型的函数
这时候调用fun1,就需要传入一个参数为String返回值为Int类型的函数
def fun1(f:String=>Int): Unit ={
val i: Int = f("100")
}
def f1(str: String): Int =(
str.toInt
)
fun1(f1)
def f2(str: String): Int = {
(str + "1232123").toInt
}
fun1(f2)
/**
* 使用lambda 作为参数
*
*/
fun1((s: String) => {
val i: Int = s.toInt
//最后一行作为返回值
i
})
代码运行流程图
使用lambda作为参数
fun1((s: String) =>{
val i: Int = s.toInt
//最后一行作为返回值
i
})
简写
如果代码只有一行,括号可以省略
fun1((s: String) => s.toInt + 1)
lambda 的参数类型可以省略(lambda 表达式参数的类型会自动推断)
fun1(s=>s.toInt)
如果lambda的参数只是用来一次可以使用下划线代替
fun1(_.toInt)
以函数作为参数的应用
有一个数组,里面有很多元素,我们对其进行遍历
val arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
foreach:一行一行遍历数组中的元素,将数组中的元素一个一个传递给后面的函数,foreach将循环之后需要做的处理交给调用者,调用者传一个函数进去
arr.foreach((i:Int) =>{ println(i+1) })
简写:
arr.foreach(i => println(i + 1))
或者:
arr.foreach(println(_))
println是一个参数为Any没有返回值的函数
arr.foreach需要的是参数为Int没有返回值的函数
scala函数的调用也符合多态的思想
简写最终:
arr.foreach(println)