在 Kotlin 編程中,Lambda 表達式是一項非常實用且強大的功能。今天,我們就來深入探討一下 Lambda 表達式的語法結構,以及它那些令人 “又愛又恨” 的簡化寫法。
一、Lambda 表達式完整語法結構
Lambda 表達式最完整的語法結構定義為{參數名1: 參數類型, 參數名2: 參數類型 -> 函數體} 。這里,最外層的大括號是 Lambda 表達式的標志;如果有參數傳入,需要在大括號內聲明參數列表,參數列表以->符號結尾,該符號同時也表示函數體的開始。在函數體中,我們可以編寫代碼,但不建議編寫過長的代碼,因為最后一行代碼會自動作為 Lambda 表達式的返回值。
二、通過實例理解 Lambda 表達式的應用
以找出單詞最長的水果為例,我們常用的函數式 API 中maxBy函數,本質上就是一個接收 Lambda 類型參數的普通函數。在遍歷集合時,maxBy函數會將每次遍歷的值作為參數傳遞給 Lambda 表達式,根據我們傳入的條件來遍歷集合,從而找到該條件下的最大值。
比如,我們有如下水果列表:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
想要找到單詞最長的水果,條件自然是單詞的長度。我們套用 Lambda 表達式完整語法結構來使用maxBy函數:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)
在這段代碼中,maxBy函數接收了一個 Lambda 參數,該參數完全遵循我們前面學習的表達式語法結構,相對來說比較容易理解。
三、Lambda 表達式的逐步簡化
雖然上述寫法可以正常運行,但略顯啰嗦,有許多可簡化的地方。接下來,我們就通過一步步推導,讓代碼變得更加簡潔。
第一步:直接傳入 Lambda 表達式
我們不需要專門定義一個lambda變量,而是可以直接將 Lambda 表達式傳入maxBy函數當中,簡化后的代碼如下:
val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })
第二步:調整 Lambda 表達式位置
Kotlin 規定,當 Lambda 參數是函數的最后一個參數時,可以將 Lambda 表達式移到函數括號的外面,代碼進一步簡化為:
val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }
第三步:省略函數括號
如果 Lambda 參數是函數的唯一一個參數,還能將函數的括號省略,代碼變成:
val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }
此時,代碼看起來清爽了許多。
第四步:利用類型推導省略參數類型
由于 Kotlin 擁有出色的類型推導機制,Lambda 表達式中的參數列表在大多數情況下不必聲明參數類型,代碼可進一步簡化:
val maxLengthFruit = list.maxBy { fruit -> fruit.length }
第五步:使用it關鍵字
當 Lambda 表達式的參數列表中只有一個參數時,也不必聲明參數名,而是可以使用it關鍵字來代替,最終得到的代碼為:
val maxLengthFruit = list.maxBy { it.length }
通過這樣一步步的推導,我們就得到了和一開始那段函數式 API 一模一樣的簡潔寫法,是不是對 Lambda 表達式的理解更加深刻、輕松了呢?
掌握 Lambda 表達式的這些語法和簡化技巧,能讓我們在 Kotlin 編程中寫出更加簡潔、優雅的代碼,提高編程效率。希望今天的分享能幫助大家更好地駕馭 Lambda 表達式!