快速入門kotlin-Lambda編程

集合的創建與遍歷

集合的函數式API是用來入門Lambda編程的最佳示例,我們先用kotlin創建一個包含許多水果的集合,然後將水果一個個添加到集合中

val list = ArrayList<String>()
list.add("蘋果")
list.add("香蕉")
list.add("梨子")
list.add("葡萄")

這種初始化集合的方式比較麻煩,kotlin爲我們提供了一個內置的listOf()函數來簡化集合的初始化

val list = listOf("蘋果", "香蕉", "梨子", "葡萄")

// 集合也可以用for-in來遍歷
for (fruit in list) {
	println(fruit)
}

// 這裏需要注意,listOf()函數創建的是一個不可變的集合,我們無法對它進行添加,修改,刪除操作。

要創建一個可變的集合,kotlin爲我們提供了mutableListOf()函數

val list = mutableListOf("蘋果", "香蕉", "梨子", "葡萄")
list.add("草莓")
list.add("芒果")

kotlin中Set集合的用法與List幾乎一模一樣,提供了setOf與mutableSetOf()函數,Set集合中不可以存放重複的元素,如果存放了多個相同的元素,只會保留其中一份。

kotlin中使用Map集合如下

val map = HashMap<String, Int>()
map["apple"] = 1
map["banana"] = 2

// kotlin還提供了一堆mapOf()和mutableMapOf函數簡化Map的用法
val map2 = mapOf("apple" to 1, "banana" to 2)
// 我們可以使用for-in遍歷map集合
for ((fruit, number) in map2) {
}

Lambda

用直白的語言來闡述Lambda的話,Lambda就是一小段可以作爲參數傳遞的代碼,普通情況下,我們給函數傳參時只能傳入變量,而使用Lambda卻可以傳入一小段代碼,下面是Lambda表達式的結構

{ 參數1: 參數1類型,參數2:參數2類型 -> 函數體 }

Lambda表達式最外層是一對大括號,如果有參數傳入到Lambda表達式中,我們需要聲明參數列表,參數列表結尾使用 -> 符號,表示參數列表的結束以及函數體的開始,函數體中可以編寫任意行數的代碼,最後一行代碼會自動作爲Lambda表達式的返回值。

集合的函數式API

我們先來看一個maxBy函數,它接收一個Lambda類型的參數,並且會遍歷集合的同時將每次遍歷的值作爲參數傳遞給Lambda表達式。maxBy函數的工作原理是根據我們傳入的條件來遍歷集合,從而找到該條件下的最大值,比如我們想要找到名稱最長的水果,那麼條件自然是名稱的長度

val list = listOf("apple", "banana", "orange", "pear")
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)

這種寫法雖然能正常運行,但還是比較囉嗦,我們可以直接將lambda表達式傳入maxBy函數中

val list = listOf("apple", "banana", "orange", "pear")
val maxLengthFruit = list.maxBy({fruit: String -> fruit.length})

// 然後kotlin規定,當Lambda參數是函數的最後一個參數時,可以將Lambda表達式移到函數括號外面
val maxLengthFruit = list.maxBy(){fruit: String -> fruit.length}

// kotlin又規定,當Lambda參數是函數唯一一個參數時,可以省略函數的括號
val maxLengthFruit = list {fruit: String -> fruit.length}

// 別慌,我們還可以繼續簡化,由於kotlin有出色的類型推導機制,Lambda表達式中的參數列表其實在大多數情況下不必聲明參數類型
val maxLengthFruit = list {fruit -> fruit.length}

// 最最後,我們還可以簡化它,當Lambda表達式的參數列表只有一個參數時,也不必聲明參數,而是可以使用it關鍵字來代替
val maxLengthFruit = list { it.length }

通過上面一步步的簡化相信大家對Lambda表達式有一些瞭解了,我們再來學學集合中比較常用的其他函數式API

// map函數用於將集合中的每個元素都映射成一個另外的值,
// 映射的規則在Lambda表達式中指定,最終生成一個新的集合,
// 比如我們希望集合中的水果名稱都變成大寫
val newList = list.map { it.toUpperCase() }

// filter函數用來過濾集合中的數據,比如我們只想保留名稱在5個字母以內的水果
val newList = list.map { it.length <= 5 }

// any函數用於判斷集合中是否至少存在一個元素滿足條件,返回true或false
val anyRes = list.any { it.length <= 5 } // 檢測是否至少有一個水果名稱在五個字符以內

// all函數用於判斷集合中是否所有元素都滿足條件,返回true或false
val allRes = list.all { it.length <= 5 } // 檢測是否所有水果名稱都在五個字符以內
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章