1 指向函数的变量
注意:ceil 后的_表示该函数的所有参数
val xfunc=scala.math.ceil _
val r=xfunc(4.5)
存储自定义函数的变量,在map方法返回集合
def calc(x:Int)=3*x+1
def calc2(x:Int)=8+x
def main(args: Array[String]): Unit = {
//存储函数地址的变量
var f1=calc _
//集合的map操作
var arr1=(1 to 10).map(3*_+1)
f1=calc2 _
var arr2=(1 to 10).map(f1)
println(arr1+"\n"+arr2)
}
2 map中使用匿名函数及参数特点
//map中使用匿名函数
// var arr3=(1 to 10).map((x:Int)=>x+1)
//匿名函数的参数实施类型推断 x对应每次map迭代中获取集合的单个值
// var arr3=(1 to 10).map(x=>x+1)
// 匿名函数的参数可以使用_替代
var arr3=(1 to 10).map(_+1)
for(i<-arr3)print(i+" ")
3 高阶函数
如果一个函数参数的类型是另一个函数,将该函数称为高阶函数;
//自定义函数,该函数的参数类型和返回类型与高阶函数one的第一个参数的形式一致
def xia(n:Int)="恭喜发财,"*n
//定义高阶函数// def one(one的参数名:匿名函数(函数参数类型)=>函数的返回类型)={调用one的参数}
def one(x:(Int)=>String,y:Int)=x(y)
def two(x:Int)={x+3}
def main(args: Array[String]): Unit = {
//调用one函数,为one传递xia函数和数值作为参数
val res:String=one(xia,4)
println(res)
}
调用高阶函数参数类型推断
定义高阶函数
def msum(arg:(Double,Double)=>Double)=arg(5.5,2.0)
调用高阶函数,为其传递匿名函数,匿名参数x,y的数据类型与高阶函数声明一致
val res=msum((x:Double,y:Double)=>x*y)
但是,具体使用时候,可以jvm自动推导出参数的类型,所以可以使用如下方式调用
val res=msum((x,y)=>x*y)
4 高阶函数应用
(1 to 5).map("*"*_).foreach(println _)
val res=(1 to 3).reduceLeft(_ * _)
结果:
(1*2)*3=6
通过split的空格拆分单词,按单词字符串长度排序
val res="this is a tree".split("\\s+").sortWith(_.length > _.length)
res.foreach(println _)
5 闭包
/闭包:如果定义的函数执行返回另一个函数,包装返回中的函数称为闭包;
//作用:闭包使用函数设计模式,导致闭包的函数能够在非作用域也能够被调用;
// def bi(x:Int)=匿名函数
def bi(x:Int)=(y:Int,z:Int)=>y*z+x
def main(args: Array[String]): Unit = {
//调用外部函数,返回闭包函数
var func=bi(8)//8传递bi中x,返回后函数x=8
//分解执行闭包函数
var res=func(7,6)
println(res)