最近正在學習使用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表達式變數即可
如此一來不但大幅減少了程式碼量,而且程式碼也因此簡潔許多。
最後,學到新技術是一件開心的事情。之後若有更多應用的經驗,在再補充上來!