Scala之高階函數的理解和應用舉例

  • 定義

        1. 帶函數參數的函數被稱爲高階函數,例如map()函數就是高階函數。

  • Demo1
class HighLevelFunc

object HighLevelFunc {
  def main(args: Array[String]): Unit = {
    println(apply(layout, 10))
  }

  def apply(f: Int => String, v: Int): String = f(v)

  def layout[A](x: A): String = {
    x.toString
  }
}

       apply函數接受一個函數f作爲參數,接受一個Int類型的參數,進行f(v)運算,在下面又給出了f具體的定義(layout函數).

  • Demo2    

      同樣的,高階函數也可以產出另一個函數(即返回結果爲一個函數,而不是某個值或對象)

object HighLevelFun {
  def main(args: Array[String]): Unit = {
    val func = rectangle(12)
    val result = func(10)
    println(result)
  }

  def rectangle(length: Double): Double => Double = (high: Double) => (length + high) * 2
}

    函數rectangle的輸出是一個計算矩形周長的函數,矩形長已固定。

  • 匿名函數

       在高階函數中,經常將只需要執行一次的函數定義爲匿名函數作爲參數傳遞給高階函數,就好像map()、filter()等高階函數中經常能看到使用了匿名函數作爲參數。匿名函數在這裏有一個特性能夠幫助我們寫出更容易閱讀的函數——參數推斷

class AnonymityFunc

object AnonymityFunc {
  def main(args: Array[String]): Unit = {
    val arr = Array(3.14, 2, 3)
    val result1 = arr.map((a: Double) => a * 3)
    val result2 = arr.map((a) => a * 3) 
    val result3 = arr.map(a => a * 3) //如果匿名函數只有一個參數,則可以省略()
    val result4 = arr.map(3 * _)  //如果參數在=>右邊只出現了一次,則可以用_替換它
    println(result1.mkString(" "))
    println(result2.mkString(" "))
    println(result3.mkString(" "))
    println(result4.mkString(" "))
  }
}

請關注作者公衆號:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章