函数的字面量
另一种定义函数的方式,它省略了def,函数名以及函数的返回值类型。
语法
var 变量 = (参数列表)=>{方法体}
定义函数的方式1:def
def getsum(x:Int,y:Int):Int={
x+y
}
def main(args: Array[String]): Unit = {
println(getsum(10,20))
}
定义函数的方式2:字面量
val getsum1=(x:Int,y:Int)=>{
x+y
}
def main(args: Array[String]): Unit = {
println(getsum1(10,20))
}
字面量的简化写法
1.代码只有一句,省略{}
val getsum1=(x:Int,y:Int)=>x+y
2.使用_来代替形参
val getsum2=(_:Int)+(_:Int)
val getsum3:(Int,Int)=>Int=_+_
把函数作为参数
定义一个接收函数作为参数的函数def a(f:()=>Unit)={},其中函数的类型()=>Unit部分()为函数的参数,Unit为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。
object day15 {
/*
把一个函数 当做参数 传递给另一个函数
*/
//定义两个字面量函数。(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))
}
}
部分应用函数
如果一个函数包含多个参数,对该函数传递部分参数使得这个函数返回一个函数,那么这种函数叫做部分应用函数。
object day16 {
/*
部分应用函数
如果一个函数需要3个函数,而我们只给了2个参数,会怎么样
*/
def getsum(a:Int,b:Int,c: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))
}
}
// 定义普通函数
def mutlti(x:Int, y:Int, z:Int) = {
println(s"$x, $y, $z")
x * y * z
}
// 传入部分参数,返回部分函数
var f1 = mutlti(2, _, _)
// 调用部分函数
println( f1(10, 5) )
高阶函数
高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。
Scala的常见高阶函数包括map、flatten、flatmap、foreach、reduce、filter和fold等。
1.map函数
功能:通过对数组的每一个元素应用一个函数来构建一个新数组。
语法: 新数组 = 旧数组.map(旧元素=>新元素)
例题:把数组(1,2,3,4,5) → (2,4,6,8,10)
object day17 {
/*高阶函数:一种特殊的函数,它的参数或者返回值是函数类型
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(i<- arr2){
println(i)
}
}
}
练习题1:把(1,2,3,4,5) → (1,4,9,16,25)
object day18 {
def main(args: Array[String]): Unit = {
val arr1=Array(1,2,3,4,5)
val arr2=arr1.map(x=>x*x)
for (i<-arr2){
println(s"${i}")
}
}
}
练习题2:把(-1,2,-3,-4) → (1,2,3,4)
object day19 {
def main(args: Array[String]): Unit = {
val arr3=Array(-1,2,-3,-4)
//绝对值
val arr4=arr3.map(x=> if(x>0) x else -x)
println()
for(i <- arr4){
println(s"${i}")
}
}
foreach函数
作用:对数组的每一个元素应用函数。
语法:数组.foreach(元素=>{})
object day19 {
//foreach函数
//是数组中的每一个元素都执行一次
def main(args: Array[String]): Unit = {
val arr1=Array(1,2,3,4,5)
arr1.foreach(print)
arr1.foreach(println)
}
}