第三讲函数详解

Scala被认为是函数式编程语言,故Scala函数是Scala编程的核心。所以掌握scala的函数至关重要。

本章要点

  • 命名参数的函数
  • 可变参数的函数
  • 递归函数
  • 默认参数值函数
  • 高阶函数
  • 嵌套函数
  • 匿名函数
  • 部分应用函数
  • 柯里化函数

3.1 带名参数

在正常的函数调用中,调用的参数按照被调用函数定义的参数顺序逐个匹配。命名参数允许您以不同的顺序将参数传递给函数。语法只是每个参数前面都有一个参数名称和一个等号。
函数定义

   def printInt( a:Int, b:Int ) = {
      println("Value of a : " + a );
      println("Value of b : " + b );
   }

调用的时候

3.2 可变参数

和java一样,Scala允许指定函数的最后一个参数可重复。 这允许客户端将可变长度参数列表传递给函数。 这里参数类型实际上是Array 。
例子:

   def sum( arrays :Int * ) = {
     var sum:Int=0;
     for(a<-arrays){
       sum+=a;
     }
     sum
   }

调用

 sum(1,2,3)

3.3 递归函数

Scala支持递归函数。 递归表示一个函数可以重复调用自身。

def digui(i:Int):Int={
     if(i<=0){
       1
     }else{
       i*digui(i-1)
       }
   }

3.4 默认参数值函数

  • 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
  • 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
    def fun3(a :Int = 10,b:Int) = {
      println(a+b)
    }

调用

    fun3(b=2)

3.5 高阶函数

函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。

  • 函数的参数是函数
  • 函数的返回是函数
  • 函数的参数和函数的返回是函数
    函数定义
   def hello(info:String):String={
      "hello   "+info      
    }
    def byebye(info:String):String={
      "byebye   "+info      
    }
    def highfuc(fuc:(String)=> String,info:String )={
      fuc(info)
    }

函数调用:

    println(highfuc(hello, "zhaoshichao"))
    println(highfuc(byebye, "zhaoshichao"))

执行的结果是


第三讲函数详解_第1张图片
结果.png

3.6 嵌套函数

Scala允许您定义函数内部的函数,而在其他函数中定义的函数称为局部函数。这是一个阶乘计算器的实现,我们使用传统的技术来调用第二个嵌套方法来完成工作。

    def jiecheng(i: Int): Int = {
      def qiantao(i: Int, accumulator: Int): Int = {
         if (i <= 1){
            accumulator
         }else{
           qiantao(i - 1, i * accumulator)
         }
      }
      qiantao(i, 1)
   }

3.7 匿名函数

Scala提供了一个相对轻量级的语法来定义匿名函数。源代码中的匿名函数称为函数文字,在运行时,函数文字被实例化为称为函数值的对象。

//有参数匿名函数
    val value1 = (a : Int) => {
      println(a)
    }
    value1(1)
    //无参数匿名函数
    val value2 = ()=>{
      println("我爱尚学堂")
    }
    value2()
    //有返回值的匿名函数
    val value3 = (a:Int,b:Int) =>{
      a+b
    }
    println(value3(4,4)) 

注意

  • 可以将匿名函数返回给val定义的值
  • 匿名函数不能显式声明函数的返回类型

3.8 偏应用函数

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

例子:

 /**
     * 偏应用函数
     */
    def log(date :Date, s :String)= {
      println("date is "+ date +",log is "+ s)
    }
    val date = new Date()
    log(date ,"log1")
    log(date ,"log2")
    log(date ,"log3")
    //想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
    val logWithDate = log(date,_:String)
    logWithDate("log11")
    logWithDate("log22")
    logWithDate("log33")

3.9 柯里化函数

柯里化(Currying)函数是一个带有多个参数,并引入到一个函数链中的函数,每个函数都使用一个参数。 柯里化(Currying)函数用多个参数表定义,如下所示:

   /**
     * 柯里化函数
     */
    def fun7(a :Int,b:Int)(c:Int,d:Int) = {
      a+b+c+d
    }
    println(fun7(1,2)(3,4))//调用

柯里化(Currying)函数可以理解为高阶函数的简化

你可能感兴趣的:(第三讲函数详解)