概念
一个函数的参数或返回值还是函数,这个函数就是高阶函数
用法
参数为函数
scala> val arr=Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3)
scala> val fun=(x:Int)=>x*2
fun: Int => Int = <function1>
scala> arr.map(fun)
res9: Array[Int] = Array(2, 4, 6)
参数为匿名函数
scala> arr.map(_*2)
res11: Array[Int] = Array(2, 4, 6)
参数为方法
为什么参数可以是方法,应该是有某个隐式函数把方法转换为了函数
object _014 {
def main(args: Array[String]): Unit = {
val p=new Weather(Seq(1,2,3))
println(p.transfer)//List(33.8, 35.6, 37.4)
}
}
class Weather(temperture:Seq[Double]){
//定义一个摄氏度转华氏度的方法
def convertCtoF(temp:Double):Double=temp*1.8+32
def transfer:Seq[Double]=temperture.map(convertCtoF)
}
返回值为函数
object _015Test {
def main(args: Array[String]): Unit = {
println(getURL.toString())
println(url)//https://www.example.com/users?id=1
}
//定义一个方法,运行结果是一个function
//(String,String)=>String代表返回值类型,就是说冒号后面这个整体代表返回值类型
def urlBuilder(ssl:Boolean,domainName:String):(String,String)=>String={
val schema=if(ssl)"https://" else "http://"
//定义一个函数,作为返回值,该函数有两个参数,类型为String,返回值类型也是STring
(endpoint:String,query:String)=>s"$schema$domainName/$endpoint?$query"
}
val domainName="www.example.com"
val getURL=urlBuilder(ssl=true,domainName)
val endpoint ="users"
val query="id=1"
val url=getURL(endpoint,query)
}
闭包
1 是一个函数
2 返回值依赖于函数外部的一个或多个变量
object _016Test {
def main(args: Array[String]): Unit = {
println(multiplier(2))//6
}
var factor=3
val multiplier: Int => Int = (i:Int)=>i*factor
}
柯里化
指的是把多个参数的函数转化为一个参数的函数,预处理思想.
scala> def curriculum(x: Int)(y: Int)(z: Int): Int = x + y + z
curriculum: (x: Int)(y: Int)(z: Int)Int
scala> curriculum(4)(2)(5)
res13: Int = 11