技術學習記錄

[Android]Kotlin學習筆記#4-的lambda表達式

最近正在學習使用Kotlin的lambda表達式。

對於以前習慣寫Java的的我來說,還蠻陌生的…

(雖然Java 8也有導入lambda表達式,但始終沒有用過)

lambda許多人把它翻成匿名函式,意思就是不需要定義函式名稱的副程式。

一般主要用於委派、匿名函式,lambda表達式可以被當作引數傳遞或是返回值,以下是目前學習的粗略紀錄。

lambda表達式的用法

這裡使用官方範例來demo:

// All examples create a function object that performs upper-casing.
// So it's a function from String to String

val upperCase1: (String) -> String = { str: String -> str.uppercase() } // 1

val upperCase2: (String) -> String = { str -> str.uppercase() }         // 2

val upperCase3 = { str: String -> str.uppercase() }                     // 3

// val upperCase4 = { str -> str.uppercase() }                          // 4

val upperCase5: (String) -> String = { it.uppercase() }                 // 5

val upperCase6: (String) -> String = String::uppercase                  // 6

println(upperCase1("hello"))
println(upperCase2("hello"))
println(upperCase3("hello"))
println(upperCase5("hello"))
println(upperCase6("hello"))

如上面程式碼的4、6、8、12、14所示,=左邊為宣告的型別,=右邊則是lambda表達式要執行的內容。

lambda表達式的關鍵字是箭頭(->),宣告時箭頭前方要放上傳入的參數及型態,後方則是要回傳的型別。

lambda的主體以 { } 包著,箭頭前方表示的是傳入的參數,後方則是要處理的內容。

lambda表達式也可以傳入多個參數,參數間隔用 , 區隔,如下方程式碼所示:

val sumString1 = { str1: String, str2: String -> str1 + str2}
    
val sumString2: (String, String) -> String = {str1, str2 -> str1 + str2}
    
println(sumString1("Hello", "World"))
println(sumString2("Hello", "World"))

lambda還可以作為引數方式傳遞,如下方程式碼所示:

fun main() {
    // Lambda 表達式,隨機生成0~100的任意數並回傳
    var func = {
    	(0..100).random()
    }
    
    process("Operation 1 Finish", func)
    
    // Lambda 表達式簡化
    process("Operation 2 Finish") { 1 }
}

fun process(str: String, func: () -> Int) {
    println("In process")
    println("value: ${func.invoke()}")
    println(str)
}

最後,Java 的 interface 類別,如果只有一個方法。在 Kotlin 上使用時,也可以透過Lambda表達式來呼叫。這個行為叫做SAM conversions,如下:

button.setOnClickListener { it ->
    it.text = "我被按下了"
}

最後

以上是我目前學習到的 lambda 表達式的用法。

以往在寫Java的程式時,常常會因為要跨類別傳遞資料而實作一系列的interface。

用了Kotlin上的Lambda表達式之後,跨類別傳遞資料變得更簡單了。

而且也不用實作一系列的介面類別,只需宣告public的lambda表達式變數即可

如此一來不但大幅減少了程式碼量,而且程式碼也因此簡潔許多。

最後,學到新技術是一件開心的事情。之後若有更多應用的經驗,在再補充上來!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *