跳至主要内容

Scala Function 與 Lambda

關於 Scala Function/Lambda

關於 Function 語法結構

  • scala function 的參數都是 val不可修改
  • 斯斯有三種, Scala function 也有三種
    • first-class method, 一級函數
    • lambda
    • 函數變數
  • 一個原始定義的 first-class function 結構, 用 等號 =
  • 一個原始定義的 lambda expression 結構, 用 箭號 =>
  • 一個 函數變數 method variable, 變數後接 function 的整個結構. 因為是變數, 所以等號移到變數之後, 而非實作區塊前
    • 可以傳給他人的結構
    • 想複寫 Scala 預設 getter/setter 時使用. 下方 Class 相關章節範例

宣告的結構的語法

    //#1 一個 function
def fun1(num1: Int, num2: Int) = { num1 + num2 }

//#3 一個函數變數
val mutator = (num1: Int, num2: Int) { println(num1 + num2) }

//#2 一個 lambda
val lambFun = (num1: Int, num2: Int) => { num1 + num2 }

function 與 lambda expression 的外觀差異

  • lambda 是一個 expression, 由變數承接所以變數後加的是 等號
  • Scala lambda 結構
    • 給 lambda 一個代號
    • 省略 labmda exp 中的變數名稱
    • 把 type 再移到 wildcard 上
  • High order function : Signature 中有 fun(函數型別) 的 function
    • doThat
    • labmda 與 function type 差異
      • labmda 後面接實作
      • fun type 後面定義回傳型別

Scala Function and Lambda 基本結構範例

    /#1 一個 function
def fun1(num1: Int, num2: Int) = { num1 + num2 }

//#2 一個 lambda
(num1: Int, num2: Int) => { num1 + num2 }

//#31給 lambda 一個名子
val lambFun = (num1: Int, num2: Int) => { num1 + num2 }

//#32 省略 lambda exp 中的變數名稱
//只能用 _
val sum1: (Int, Int) => Int = _ + _

//#33 省略 lambda expression 中的 signature
//只能用 _
val sum = (_:Int) + (_:Int)


//#4 fun type : doThat
def process2(num1: Int, num2: Int, doThat: (Int, Int) => Int) = {
doThat(num1, num2)
}


//#5 lambda examples
val sayHello1 = (name: String) => "Hello " + name
val sayHello2 = "Hello " + (_: String)
val sayHello3 = "Hello " + _
def sayHello4 = "Hello " + _

sayHelloN("Daniel")
//String = Hello Daniel


//#6
def notImplYet(a: Int): Int = ???

def notImplYet(a: Int): Int ={
throw new NotImplementedError("an implementation is missing~~")
}