一、創(chuàng)建與遍歷集合
1.List與Set集合
(1).不可變集合:無(wú)法進(jìn)行增刪改查操作
val list = listOf("王大錘", "愣子", "歐陽(yáng)瘋子")
(2).可變集合:可以進(jìn)行增刪改查操作
val list = mutableListOf("王大錘", "愣子", "歐陽(yáng)瘋子")
list.add("李大麻子")
for (i in list) {
println(i)
}
//輸出日志:王大錘 愣子 歐陽(yáng)瘋子 李大麻子
Set用法與List一模一樣忌堂,只是替換成了setOf()
和mutableSetOf()
盒至,另外List是有序的,Set是無(wú)序的。
2.Map集合
(1).數(shù)組下標(biāo)語(yǔ)法結(jié)構(gòu)的寫法
val map = HashMap<String, Int>()
map["王大錘"] = 1
map["李大麻子"] = 2
map["愣鬼"] = 3
取數(shù)據(jù)
val number = map["愣鬼"]
(2).mapOf枷遂、mutableMapOf的寫法
val map = mapOf("王大錘" to 1, "李大麻子" to 2, "愣鬼" to 3)
for ((key, value) in map) {
println(key + value)
//輸出日志:王大錘1 李大麻子2 愣鬼3
}
二樱衷、集合的函數(shù)式API
1.Lambda表達(dá)式
Lambda的定義:Lambda就是一小段可以作為參數(shù)傳遞的代碼。
Lambda語(yǔ)法結(jié)構(gòu):{參數(shù)名1 : 參數(shù)類型 , 參數(shù)名2 : 參數(shù)類型 -> 函數(shù)體}
酒唉,首先最外層是一對(duì)大括號(hào)矩桂,如果有參數(shù)傳入的話,需要聲明參數(shù)列表痪伦,參數(shù)列表的結(jié)尾使用一個(gè) -> 符號(hào)侄榴,表示參數(shù)列表的結(jié)束與函數(shù)體的開(kāi)始,函數(shù)體中可以編寫任意行代碼网沾,并且最后一段代碼會(huì)自動(dòng)作為L(zhǎng)ambda的返回值癞蚕。
(1)maxBy()函數(shù)
工作原理:它接受的是一個(gè)Lambda類型的參數(shù),根據(jù)我們傳入的條件來(lái)遍歷集合绅这,從而找到條件下的最大值涣达。
eg:找出集合中單詞最長(zhǎng)的名字:
val list = listOf("王大錘", "愣子", "歐陽(yáng)瘋子")
var maxLenthName = ""
for (i in list) {
if (i.length > maxLenthName.length) {
maxLenthName = i
}
}
使用集合式API簡(jiǎn)化后
val list = listOf("王大錘", "愣子", "歐陽(yáng)瘋子")
//簡(jiǎn)化一
val lambda = { name: String -> name.length }
list.maxBy(lambda)
//簡(jiǎn)化二
list.maxBy({ name: String -> name.length })
//簡(jiǎn)化三
list.maxBy() { name: String -> name.length }
//簡(jiǎn)化四
list.maxBy { name: String -> name.length }
//簡(jiǎn)化五
list.maxBy { name -> name.length }
//簡(jiǎn)化六
list.maxBy { it.length }
原理:
1.當(dāng)Lambda參數(shù)是函數(shù)最后一個(gè)參數(shù)時(shí),可以將Lambda表達(dá)式移到函數(shù)括號(hào)外面 (二到三)证薇。
2.當(dāng)Lambda參數(shù)勢(shì)函數(shù)唯一一個(gè)參數(shù)時(shí)度苔,可以將函數(shù)的括號(hào)省略(三到四)。
3.由于Kotlin擁有出色的類型推導(dǎo)機(jī)制浑度,Lambda表達(dá)式中的參數(shù)列表大多數(shù)情況下不必聲明參數(shù)類型(四到五)寇窑。
4.當(dāng)Lambda表達(dá)式中的參數(shù)列表只有一個(gè)參數(shù)時(shí),不必聲明參數(shù)名箩张,可以使用it關(guān)鍵字來(lái)代替(五到六)甩骏。
接下來(lái)我們?cè)賹W(xué)習(xí)幾個(gè)常見(jiàn)的函數(shù)式API
(2)map()函數(shù)
工作原理:用于將集合中每個(gè)元素都映射成一個(gè)另外的值,映射規(guī)則在Lambda表達(dá)式中指定先慷,最終生成一個(gè)新的集合饮笛。eg:
fun main() {
val list = listOf("apple", "banana", "pear")
val newList = list.map { it.toUpperCase() }
for (i in newList) {
print(i)
//輸出日志:APPLE BANANA PEAR
}
}
(3)filter()函數(shù)
工作原理:用來(lái)過(guò)濾集合中的數(shù)據(jù),過(guò)濾規(guī)則在Lambda表達(dá)式中指定论熙,福青,最終生成一個(gè)新的集合,可結(jié)合map()函數(shù)使用脓诡。eg:
un main() {
val list = listOf("apple", "banana", "pear")
val newList = list.filter { it.length > 4 }.map { it.toUpperCase() }
for (i in newList) {
print(i)
//輸出日志:APPLE BANANA
}
}
(4)any()函數(shù)與all()函數(shù)
any():用于判斷集合中是否至少存在一個(gè)元素滿足指定條件无午。
all():用于判斷集合中是否全部函數(shù)都滿足指定條件。
eg:
fun main() {
val list = listOf("apple", "banana", "pear")
val anyResult = list.any() { it.length == 4 }
val allResult = list.all() { it.length == 4 }
println("anyResult is " + anyResult + " ,allResult is" + allResult)
//輸出日志:anyResult is true ,allResult isfalse
}
三祝谚、Java的函數(shù)式API
含義:我們?cè)贙otlin中調(diào)用一個(gè)Java方法宪迟,并且該方法接收一個(gè)Java單抽象方法接口參數(shù),就可以使用函數(shù)式API交惯。Java單抽象方法接口指的是接口中只有一個(gè)待實(shí)現(xiàn)的方法次泽,如果接口中有多個(gè)待實(shí)現(xiàn)的方法穿仪,則無(wú)法使用函數(shù)式API。
舉個(gè)栗子:Java中最常見(jiàn)的單抽象方法接口--Runnable接口:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running");
}
}).start();
使用Kotlin版本:
Thread(object : Runnable {
override fun run() {
print("Thread is running")
}
}).start()
使用函數(shù)式API簡(jiǎn)化:
//簡(jiǎn)化一
Thread(Runnable {
print("Thread is running")
}).start()
//簡(jiǎn)化二
Thread {
print("Thread is running")
}.start()
原理:因?yàn)橹挥幸粋€(gè)待實(shí)現(xiàn)方法箕憾,我們就算不寫牡借,Kotlin也會(huì)明白。另外袭异,如果一個(gè)Java參數(shù)列表中不存在一個(gè)以上Java單抽象方法接口參數(shù),我們還可以將接口名進(jìn)行省略炬藤。
Android中常用的點(diǎn)擊事件接口OnclickListener就是一個(gè)單抽象方法接口御铃,就可以使用函數(shù)式API
tv.setOnClickListener{
}