scala函数式编程系列(四)--- scala函数式编程完全解密

 

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80962513

交流QQ: 824203453

 

传值调用与传名调用

通常,函数的参数是传值参数; 也就是说,参数的值在传递给函数之前确定。

其实, 在Scala中, 我们方法或者函数的参数可以是一个表达式, 也就是将一个代码逻辑传递给了某个方法或者函数.

/**
  * scala 的
  *     传名调用(call-by-name)
  *     传值调用(call-by-value)
  */
  object ScalaCallName extends App{
  
    def currentTime(): Long ={
        println("打印系统当前时间,单位纳秒")
        System.nanoTime()
    }
  
    /**
      * 该方法的参数为一个无参的函数, 并且函数的返回值为Long
      */
    def delayed(f: => Long): Unit = {
        println("delayed ===============")
        println("time = " + f)
    }
  
    def delayed1(time: Long) = {
        println("delayed1 ===============")
        println("time1 = " + time)
    }
  
    // 调用方式一
    delayed(currentTime)
  
    println("------------华丽丽的分割线----------")
  
    // 调用方式二
    val time = currentTime()
    delayed1(time)
}

 

4.13默认参数值函数

// 带默认的参数列表
  def add(a: Int = 1, b: Int = 7): Int = {
    println(s"a + b = ${a + b}" )
    a + b
}
  // 调用
  add(2)  //  带有默认值a的参数, 调用时可以不传
  add(b=9, a=2) // 调用时, 可以指定具体的参数值
  add(b=18) // 调用如果执行修改某一个具体的参数值的话, 可以指定参数名称

 

4.14高阶函数

// 高阶函数: 将其他函数作为参数或其结果是函数的函数
  
  // 定义一个方法, 参数为带一个整型参数返回值为整型的函数f 和 一个整型参数v, 返回值为一个函数
  def apply(f: Int => String, v: Int) = f(v)
  
  // 定义一个方法, 参数为一个整型参数, 返回值为String
  def layout(x: Int) = "[" + x.toString() + "]"
  
  // 调用
  println(apply(layout, 10))

4.15部分参数应用函数

如果函数传递所有预期的参数,则表示已完全应用它。如果只传递几个参数并不是全部参数,那么将返回部分应用的函数。这样就可以方便地绑定一些参数,其余的参数可稍后填写补上。

// 定义个输出的方法, 参数为date, message
  def log(date: Date, message: String) = {
    println(s"$date, $message")
}
  
  val date = new Date()
  
  // 调用log的时候, 传递了一个具体的时间参数, message 为待定参数
  // logBoundDate 成了一个新的函数, 只有log的部分参数(message)
  val logBoundDate: (String) => Unit = log(date, _: String)
  
  // 调用logBoundDate的时候, 只需要传递待传的message参数即可
  logBoundDate("fuck jerry ")
  logBoundDate("fuck 涛涛 ")

 

上述,log()方法有两个参数:date和message。我们想要多次调用该方法,具有相同的日期值,但不同的消息值。可以通过将参数部分地应用到log()方法来消除将日期传递给每个调用的干扰。为此,首先将值绑定到date参数,并将第二个参数绑定到其位置。结果是存储在变量中的部分应用函数。

4.16柯里化(Currying)

柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。

// 我们看下这个方法的定义, 求2个数的和
  def add(x: Int, y: Int) = x + y
  // 那么我们应用的时候,应该是这样用:add(1,2)
// 现在我们把这个函数变一下形:
  def add(x:Int)(y:Int) = x + y
  // 那么我们应用的时候,应该是这样用:add(1)(2),最后结果都一样是3,这种方式(过程)就叫柯里化。经过柯里化之后,函数的通用性有所降低,但是适用性有所提高。
  
  // 分析下其演变过程
  def add(x: Int) = (y: Int) => x + y
  
  // (y: Int) => x + y 为一个匿名函数, 也就意味着add方法的返回值为一个匿名函数
  // 那么现在的调用过程为
  val result = add(2)
  val sum1= result(3)
  val sum2= result(8)

4.17偏函数

被包在花括号内没有match的一组case语句是一个偏函数,它是PartialFunction[A, B]的一个实例,A代表参数类型,B代表返回类型,常用作输入模式匹配。

object PartialFuncDemo  {
  
  def func1: PartialFunction[String, Int] = {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }
  def func2(num: String) : Int = num match {
    case "one" => 1
    case "two" => 2
    case _ => -1
  }


  def main(args: Array[String]) {
    println(func1(
"one"))
    println(func2(
"one"))
  }

}

 

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80962513

交流QQ: 824203453

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值