scala 高阶函数,闭包及柯里化

概念

一个函数的参数或返回值还是函数,这个函数就是高阶函数

用法

参数为函数


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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值