函数字面量
(一)函数的字面量语法
除了使用def之外的,另一种定义函数的方式
语法:var 变量 = (参数列表)=>{方法体}
它省略了def,函数名以及函数的返回值类型。
object base45 {
/*
*函数字面量
*另一种定义函数的方式
*/
// 定义函数的方式一: def
def getSum(x:Int,y:Int):Int = {
x + y
}
// 定义函数的方式二: 字面量
val getSum1 = (x:Int,y:Int) => {
x + y
}
def main(args: Array[String]): Unit = {
println( getSum(10,20))
println( getSum1(10,20))
}
}
(二)把函数作为参数
[讲] 某个函数的参数是函数
定义:一个接收函数作为参数的函数def a(f:()=>Unit)={},其中函数的类型()=>Unit部分()为函数的参数,Unit为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。
object base46 {
/*
*函数字面量
*另一种定义函数的方式
*/
val getSum = (x:Int,y:Int) => {
x + y
}
// 省略 { }
val getSum1 = (x:Int,y:Int) => x + y
// 使用 _ 来代替形参
val getSum2 = (_:Int)+(_:Int)
// 使用 _ 来代替形参.
val getSum3:(Int, Int)=>Int = _ + _
def main(args: Array[String]): Unit = {
println( getSum(10,20))
println( getSum1(10,20))
println( getSum2(10,20))
println( getSum3(10,20))
}
}
object base47 {
/*
*把一个函数 当成参数 传递给了一个函数
*/
// 定义两个字面量函数。(Int,Int) => Int 看成一种数据类型
val f1:(Int,Int) => Int = _ + _
// val a:Int
val f2:(Int,Int) => Int = _ + _
// 定义一个函数,它有三个参数
// 参数1:类型是(Int,Int)=>Int。他表示这里需要一个函数
def test(fn: (Int,Int)=>Int,x:Int,y:Int) = {
fn(x,y)
}
def main(args: Array[String]): Unit = {
println( test(f1,10,20))
println( test(f2,10,20))
}
}
(六)Scala部分应用函数
如果一个函数包含多个参数,对该函数传递部分参数使得这个函数返回一个函数,那么这种函数叫做部分应用函数。
object base48 {
/*
*部分应用函数
*
*如果一个函数需要三个参数,而我们只给两个参数,会如何?
*/
def getSum(a:Int,b:Int,c:Int):Int = {
a + b + c
}
def main(args: Array[String]): Unit = {
println( getSum(10,20,30) )
val t = getSum(10,20,_)// t 就是部分应用函数
val t1 = getSum(_,20,_)// t 就是部分应用函数
println(t(50))
println(t1(20,50))
}
}
高阶函数
定义:高阶函数是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。 Scala的常见高阶函数包括Array.map、flatten、flatmap、foreach、reduce、filter和fold等。
object base49 {
/*
*
*高阶函数:一种特殊的函数,它的参数或者返回值是函数类型
*1.map函数
*
*
*/
def main(args: Array[String]): Unit = {
val arr1 = Array(1,2,3,4,5,6)
//Array 是一个构造器,用来定义一个数组
//arr1 就是一个数组对象,他有很多的方法,其中就有map
//for循环来输出数组中每个元素
val fn = (x:Int) => x * 2
// fn是一个函数,他被传给了map。map是一个高阶函数
val arr2 = arr1.map(fn)
//for循环来输出数组中每个元素
for(i <- arr2){
println(i)
}
}
}