線上 Kotlin 練習編譯器:https://try.kotlinlang.org/
今天要介紹的是匿名函式:lambda (讀音 lam[b]-da,[ˈlæmdə]) ,很少翻成中文。lambda 主要用於委派、匿名函式、區域函式,可將此函式當作引數傳遞或回傳值,看文字說明可能很難理解,接下來實際示範一下,就作者經驗,有部分的人一開始會很難理解 lambda 的用法,請跟著附圖一起實作吧。
lambda 的撰寫關鍵字是 ->
,一個 dash 加上大於符號,整個表達式以大括號 { }
為主體,關鍵字前方放上要傳入的參數及型態,後方則撰寫函式處理內容,如 Line: 2 所示,會由 msg
接收輸入值,到後方執行,其效果等同於 Line: 6 的 fun
寫法。當然,lambda 的用途並不僅僅是這個區別而已。
另外下圖紅框處中也展示了多行內容的寫法供參考。另外可以發現在名稱相同的狀況下 (Line: 4, 10),會發生覆蓋情形,也就是說,依照最後宣告的 printMsg 當作執行依據,當然,在正式開發時並不會這樣使用。
lambda 也可以傳入多個參數,sumA
與 sumB
分別展示了不同的寫法,sumB
主要是將傳入與回傳型態提取出來在一開始指定,雖然 lambda 對於回傳型態是可以自行推斷,不過指定的好處就是避免推斷出來的型態並非預期型態,導致接續程式設計沒有考量到。
一開頭有提到 lambda 可以將函式以引數方式傳遞,首先我們在一個 fun process
中除了接收字串參數外,也設定一個 f
支援傳入函式,在 Line: 8 使用了兩段 println
當作示範,Line: 13, 14 是相同的結果以不同方式編寫,下圖中可以看到 Line: 2,程式進入 fun process
後,仍可執行代入的函式 f()
,執行流程可參考最下方的印出結果。
lambda 也能運用在擴充方法上,str
是一個文字型態 String
,透過宣告在 String
上擴充一個 another
方法,並且支援傳入 Int
參數,方法回傳型態為 String
,方法內容則是本體 (this
) + 傳入參數 (it
)。這種寫法可以在 IDE 中打上任何自串型態變數時,能從編輯建議中看到 another
的蹤跡。
在陣列中也有 lambda 的使用方式,Line: 4 代表將 arr
之中的每一個值以 item
代稱,接著在 ->
之後進行處理。Line: 5 的示範表示 item
並非固定命名,你可以使用任何的代稱,不過還是注意易讀及易用性的平衡。Line: 6 則介紹 it
這個關鍵字,使用 it
時就可省略前面的代稱指定,示範參照下圖:
lambda 的實務使用最簡單的舉例,宣告一個 arrayOf
,再以此變數去看有哪些方法可以使用,你就會發現有很多應用都有使用到。
對於一開始接觸的人可能會覺得 a -> a > 3
這堆符號到底在表達什麼很難懂,最簡單的方式是把 ->
視為分隔,前面為代稱,後方為要處理的方法,避免整段連在一起看,應該會比較好理解。
後面的章節也會實際運用 lambda 達成一些設計,同時預告關於 Kotlin 純程式語言的文章在明天會是最後一節,接著會再回到 Android Studio 上,今天的課程就到這邊,我們明天見!
資料參考
Lambda Expressions in Kotlin
https://www.baeldung.com/kotlin-lambda-expressions