iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 16
1

今天會講到

  • 如何定義 Lambdas 表達式

  • 將 Lambdas 表達式 當作參數傳遞

  • 將 Lambdas 表達式 當作返回值返回

如何定義?:

1. Type part

(Int, Int) 代表兩個傳入的參數 , Unit 代表並沒有要回傳任何 value


(Int, Int) -> Unit

括號內 可以為空,代表沒有傳入任何參數


() -> Unit

下面為有返回值,返回值為 Int 型態的 參數

如果沒有要返回任何 value 可以填 Unit 但不可省略不填


(Int, Int) -> Int

2. Object part

下面的 Type 並無傳入參數 , 也無回傳值 ,

1- Object 這樣表示{ println("Hello!")} ,只剩下 body (執行程式碼的部分) ,其他省略。
2- greeting() greeting 變數 變成可以跟 function 一樣調用,也可以寫成
greeting.invoke()


fun main(args: Array<String>) {

    val greeting:() -> Unit = { println("Hello!")}

    // invoking function
    greeting()
    
    // 也可以寫成下面這樣
    
    greeting.invoke()
}


the output will be:


Hello!

下面的 Type 需要傳入參數 , 但無需有回傳值 。

1- Object 這樣表示 { it -> println(it)}
2- greeting("Hello!") 傳入 String , greeting 變數 變成可以跟 function 一樣調用 ,也可以寫成
greeting.invoke("Hello!")


fun main(args: Array<String>) {

    val greeting:(String) -> Unit = { it -> println(it)}

    // invoking function
    greeting("Hello!")
    
        // 也可以寫成下面這樣
    
    greeting.invoke("Hello!")
}

the output will be:


Hello!

下面的 Type 並有傳入參數 , 也有回傳值 。 預設是 Body 最後一句 expression 為回傳值

fun main(args: Array<String>) { 

val product:(Int,Int) -> Int = { a: Int, b: Int -> a * b } 

val result = product(9, 3) 

println(result) }

the output will be:


27

Lambdas 表達式 Higher-Order Function

當參數傳遞給 function

將 Lambdas Object 當作參數 傳給 function (passMeFunction)變數 abc

再將 abc 變數像 function 一樣 調用 , 做法是 變數 加上 () 或 .invoke()


// abc 是變數名

// "() -> Unit"  is a type  , 參看上面 

fun passMeFunction (abc:() -> Unit){

abc()
// 或者是
abc.invoke()

}

將 lambda 表達式 的 Object "{println("Hello !")}" , 傳給 passMeFunction function

fun main(){

//  如果不懂 請 參考上面 Lambdas 表達式 

// {println("Hello !")} 是要傳給 passMeFunction abc 變數的 物件

passMeFunction({println("Hello !")})

}

the output will be:

Hello !

我們可以將 passMeFunction 調用的寫法


passMeFunction({println("Hello !")})

簡化成下面這樣


passMeFunction{println("Hello !")}


  • it Keyword

我們可以將 Object 參數部分 ( -> 前面部分 ) 以 it 或其他名稱代替

我們可以將下面這個 person 名稱


   val selectedPerson = people.maxBy({ person ->  person.age })


替換成 it


 val selectedPerson = people.maxBy({ it ->  it.age })

當作返回值回傳

如何定義



fun returnMeAddFunction(): ((Int, Int) -> Int) {
   
   //  將 lambda 表達式 做返回
  return {a: Int, b: Int -> a + b}
}

fun main(){

val add = returnMeAddFunction()

val result = add(2, 2)

println(result)

}

創建一個和 lambda 表達式 具有相同功能的函數 ,並代替他


// 與上面  {a: Int, b: Int -> a + b} 有相同功能

fun add(a: Int, b: Int): Int {
    
  return a + b
}



fun returnMeAddFunction(): ((Int, Int) -> Int) {
   
   // 使用:: 加上 function 名稱 add ,  代替 {a: Int, b: Int -> a + b} 
   return ::add
}

fun main(){

val add = returnMeAddFunction()

val result = add(2, 2)

println(result)

}


上一篇
[Day 15] Kotlin Interface
下一篇
[Day 17] Kotlin 泛型
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言