函数的应用:以函数作为参数(重点)
以函数作为参数、以函数中作为返回值
统称为高阶函数
package com.shujia.scala
object Demo15 {
def main(args: Array[String]): Unit = {
/**
* 以函数作为参数
*
* f:是一个参数为String类型、返回值为Int类型的函数
* fun1是一个参数为f,没有返回值的函数
*
*/
//定义一个函数,(参数为String类型、返回值为Int类型的函数)作为定义函数的参数
def fun1(f:String => Int):Unit= {
//在定义的函数内,调用传入进来的函数
val i: Int = f("666")
println(i) //666
}
//定义一个函数,作为调用fun1函数时需要传入的参数
def f1(str:String):Int = {
str.toInt
}
//调用定义的函数fun1,需要传入一个参数为String类型、返回值为Int类型的函数
fun1(f1)
}
}
执行顺序
使用lambda格式作为参数
package com.shujia.scala
object Demo15 {
def main(args: Array[String]): Unit = {
/**
* 以函数作为参数
*
* f:是一个参数为String类型、返回值为Int类型的函数
* fun1是一个参数为f,没有返回值的函数
*
*/
//定义一个函数,(参数为String类型、返回值为Int类型的函数)作为定义函数的参数
def fun1(f:String => Int):Unit= {
//在定义的函数内,调用传入进来的函数
val i: Int = f("666")
println(i) //666
}
//使用lambda格式作为参数
fun1((str:String) => str.toInt)
//lambda的参数类型可以省略,lambda表达式参数类型会自动推断
// fun1(s => s.toInt)
//如果lambda的参数只使用了一次可以使用下划线代替
// fun1(_.toInt)
}
}
以函数作为参数应用举例
案例1
package com.shujia.scala
object Demo15 {
def main(args: Array[String]): Unit = {
//定义一个数组
val arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)
arr.foreach((i:Int) =>{
println(i + 2) //3 4 5 6 7 8 9 10 (实际是一行一个元素,这样写方便查看)
})
/**
* foreach:一行一行遍历数组中的元素, 将数组中的元素一个一个传递给后面的函数
* foreach 将循环之后需要做的处理交给调用者,调用者传一个函数进去
*/
//简写
arr.foreach(i=>println(i+2)) //3 4 5 6 7 8 9 10 (实际是一行一个元素,这样写方便查看)
//再简写(这种简写只能遍历原始的元素,无法对元素进行操作)
arr.foreach(println) //1 2 3 4 5 6 7 8 (实际是一行一个元素,这样写方便查看)
/**
* println 是一个参数为Any 没有返回值的函数
* arr.foreach 需要的是参数为Int、没有返回值的函数(刚好可以传入 println)
*
* scala函数的调用也符合多态的思想
*/
}
}
案例2
需求:将数组中的数据都加2
object Demo18 {
def main(args: Array[String]): Unit = {
//定义一个数组
val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
//方法1:利用Java的格式
var i = 0
while (i < arr.length) {
arr(i) = arr(i) + 2
i += 1
}
arr.foreach(println) //3 4 5 6 7 8 9 10 11
}
}
object Demo18 {
def main(args: Array[String]): Unit = {
//定义一个数组
val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
//方法2:Scala的方式:map
/**
* map: 将数组中的元素一个一个传递给后面的函数
* map 会将后面的函数的返回值构建成一个新的数组
* 返回一个新的数组
*/
val arr2: Array[Int] = arr.map((i: Int) => i + 2)
arr2.foreach(println)
}
}
需求:将数组中的元素奇数加1,偶数乘以2
object Demo18 {
def main(args: Array[String]): Unit = {
//定义一个数组
val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
val arr3: Array[Int] = arr.map((i: Int) => {
if (i % 2 == 1) {
i + 1
} else {
i * 2
}
})
arr3.foreach(println) //2 4 4 8 6 12 8 16 10
}
}