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

 

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

欢迎访问:https://blog.youkuaiyun.com/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.youkuaiyun.com/qq_21439395/article/details/80962513

交流QQ: 824203453

 这本书绝不轻易放过每个知识点,全书包含有大量习题,要求你自己实现 Scala 标准库Scalaz 中的既有功能。所以,当你读完本书,做完习题后,虽然你的应用开发能力并不会直接提升,但你会体会到构建函数式语言框架时的难点取舍,从而增进你的框架开发语言设计的能力。   ——ThoughtWorks Lead Consultant 杨博   这本书所讲授的,正是基于 Scala函数式编程基础。基于 Scheme、Haskell 等老牌函数式语言的传统教材的问题在于,相关语言的语法思维方式与读者现有的知识体系迥异,容易造成较为陡峭的入门门槛。此外,由于这些语言本身的实际应用机会不多,初学者也难以在实战中获得宝贵的直觉经验。而在 Scala 的帮助下,这本书并不要求你抛开现有的思维方式另起炉灶,它所做的更像是为你现有的思维方式添砖加瓦,从而令你如虎添翼。   ——Spark committer from Databricks 连城   尽管函数式编程在近十多年用得越来越多,但市面上介绍其高阶特性的书却并不多。这本书在这方面是个重要的补充,它不仅仅面向 Scala 程序员,同样面向用任何编程语言开发的程序员,只要你充满好奇心。   ——挖财网首席架构师 王宏江   “让你洞察计算的本质。”   ——Martin Odersky, Scala的作者   “ScalaJava8开发者的函数式编程指南!”   ——William E. Wheeler, TekSystems   “本书向你展示了提升Scala技能的方法理念,它已超过‘更好的Java’。”   ——Fernando Dobladez, Code54   “里面的练习有些挑战,很有趣,对你在真实世界中使用它很有益。”   ——Chris Nauroth, Hortonworks   “边干边学,而非只是阅读。”   ——Douglas Alan、EliEdythe L. Broad,哈佛麻省理工学院
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值