1. 程式人生 > 其它 >Scala函式的應用:以函式作為引數(重點)

Scala函式的應用:以函式作為引數(重點)

函式的應用:以函式作為引數(重點)

以函式作為引數、以函式中作為返回值
統稱為高階函式

package com.shujia.scala

object Demo15 {
  def main(args: Array[String]): Unit = {
    /**
     * 以函式作為引數
     *
     * f:是一個引數為String型別、返回值為Int型別的函式
     * fun1是一個引數為f,沒有返回值的函式
     *
     */
    //定義一個函式,(引數為String型別、返回值為Int型別的函式)作為定義函式的引數
    def fun1(f:String => Int):Unit= {
      //在定義的函式內,呼叫傳入進來的函式
      val i: Int = f("666")
      println(i)  //666
    }

    //定義一個函式,作為呼叫fun1函式時需要傳入的引數
    def f1(str:String):Int = {
      str.toInt
    }

    //呼叫定義的函式fun1,需要傳入一個引數為String型別、返回值為Int型別的函式
    fun1(f1)

  }
}

執行順序

使用lambda格式作為引數

package com.shujia.scala

object Demo15 {
  def main(args: Array[String]): Unit = {
    /**
     * 以函式作為引數
     *
     * f:是一個引數為String型別、返回值為Int型別的函式
     * fun1是一個引數為f,沒有返回值的函式
     *
     */
    //定義一個函式,(引數為String型別、返回值為Int型別的函式)作為定義函式的引數
    def fun1(f:String => Int):Unit= {
      //在定義的函式內,呼叫傳入進來的函式
      val i: Int = f("666")
      println(i)  //666
    }

    //使用lambda格式作為引數
    fun1((str:String) => str.toInt)
      
    //lambda的引數型別可以省略,lambda表示式引數型別會自動推斷
//    fun1(s => s.toInt)
      
    //如果lambda的引數只使用了一次可以使用下劃線代替
//    fun1(_.toInt)
  }
}
以函式作為引數應用舉例
package com.shujia.scala

object Demo15 {
  def main(args: Array[String]): Unit = {
    //定義一個數組
    val arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)

    arr.foreach((i:Int) =>{
      println(i + 2)  //3 4 5 6 7 8 9 10  (實際是一行一個元素,這樣寫方便檢視)
    })
    /**
     * foreach:一行一行遍歷陣列中的元素, 將陣列中的元素一個一個傳遞給後面的函式
     * foreach 將迴圈之後需要做的處理交給呼叫者,呼叫者傳一個函式進去
     */

    //簡寫
    arr.foreach(i=>println(i+2))  //3 4 5 6 7 8 9 10  (實際是一行一個元素,這樣寫方便檢視)

    //再簡寫(這種簡寫只能遍歷原始的元素,無法對元素進行操作)
    arr.foreach(println)  //1 2 3 4 5 6 7 8   (實際是一行一個元素,這樣寫方便檢視)

    /**
     * println 是一個引數為Any 沒有返回值的函式
     * arr.foreach 需要的是引數為Int、沒有返回值的函式(剛好可以傳入 println)
     *
     * scala函式的呼叫也符合多型的思想
     */
  }
}