函数进阶

36 阅读3分钟

函数字面量

(一)函数的字面量语法

除了使用def之外的,另一种定义函数的方式

语法:var 变量 = (参数列表)=>{方法体}

它省略了def,函数名以及函数的返回值类型。

object base45 {
  /*
  *函数字面量
  *另一种定义函数的方式
   */

  // 定义函数的方式一: def
  def getSum(x:Int,y:Int):Int = {
    x + y
  }

  // 定义函数的方式二: 字面量
  val getSum1 = (x:Int,y:Int)  => {
    x + y
  }

    def main(args: Array[String]): Unit = {
      println( getSum(10,20))
      println( getSum1(10,20))
    }
}

(二)把函数作为参数

[讲] 某个函数的参数是函数

定义:一个接收函数作为参数的函数def a(f:()=>Unit)={},其中函数的类型()=>Unit部分()为函数的参数,Unit为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。

object base46 {
  /*
  *函数字面量
  *另一种定义函数的方式
   */

  val getSum = (x:Int,y:Int) => {
    x + y
  }

  // 省略 { }
  val getSum1 = (x:Int,y:Int) => x + y

  // 使用 _ 来代替形参
  val getSum2 = (_:Int)+(_:Int)

  // 使用 _ 来代替形参.
  val getSum3:(Int, Int)=>Int = _ + _

    def main(args: Array[String]): Unit = {
      println( getSum(10,20))
      println( getSum1(10,20))
      println( getSum2(10,20))
      println( getSum3(10,20))
    }
}
object base47 {
  /*
  *把一个函数 当成参数 传递给了一个函数
   */

 // 定义两个字面量函数。(Int,Int) => Int 看成一种数据类型
  val f1:(Int,Int) => Int = _ + _
  // val a:Int

  val f2:(Int,Int) => Int = _ + _

  // 定义一个函数,它有三个参数
  // 参数1:类型是(Int,Int)=>Int。他表示这里需要一个函数
  def test(fn: (Int,Int)=>Int,x:Int,y:Int) = {
    fn(x,y)
  }

    def main(args: Array[String]): Unit = {
      println( test(f1,10,20))
      println( test(f2,10,20))

    }
}

(六)Scala部分应用函数

如果一个函数包含多个参数,对该函数传递部分参数使得这个函数返回一个函数,那么这种函数叫做部分应用函数。

object base48 {
  /*
  *部分应用函数
  *
  *如果一个函数需要三个参数,而我们只给两个参数,会如何?
   */

  def getSum(a:Int,b:Int,c:Int):Int = {
    a + b + c
  }

  def main(args: Array[String]): Unit = {
    println( getSum(10,20,30) )

    val t = getSum(10,20,_)// t 就是部分应用函数

    val t1 = getSum(_,20,_)// t 就是部分应用函数

    println(t(50))

    println(t1(20,50))
  }
}

高阶函数

定义:高阶函数是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。 Scala的常见高阶函数包括Array.map、flatten、flatmap、foreach、reduce、filter和fold等。

object base49 {
  /*
  *
  *高阶函数:一种特殊的函数,它的参数或者返回值是函数类型
  *1.map函数
  *
  *
   */


  def main(args: Array[String]): Unit = {
    val arr1 = Array(1,2,3,4,5,6)
    //Array 是一个构造器,用来定义一个数组
    //arr1 就是一个数组对象,他有很多的方法,其中就有map
    //for循环来输出数组中每个元素

    val fn = (x:Int) => x * 2
    // fn是一个函数,他被传给了map。map是一个高阶函数
    val  arr2 = arr1.map(fn)

    //for循环来输出数组中每个元素
    for(i <- arr2){
      println(i)
    }
  }
}