一、創建與遍歷集合
1.List與Set集合
(1).不可變集合:無法進行增刪改查操作
val list = listOf("王大錘", "愣子", "歐陽瘋子")
(2).可變集合:可以進行增刪改查操作
val list = mutableListOf("王大錘", "愣子", "歐陽瘋子")
list.add("李大麻子")
for (i in list) {
println(i)
}
//輸出日誌:王大錘 愣子 歐陽瘋子 李大麻子
Set用法與List一模一樣,只是替換成了setOf()
和mutableSetOf()
,另外List是有序的,Set是無序的。
2.Map集合
(1).數組下標語法結構的寫法
val map = HashMap<String, Int>()
map["王大錘"] = 1
map["李大麻子"] = 2
map["愣鬼"] = 3
取數據
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
}
二、集合的函數式API
1.Lambda表達式
Lambda的定義:Lambda就是一小段可以作爲參數傳遞的代碼。
Lambda語法結構:{參數名1 : 參數類型 , 參數名2 : 參數類型 -> 函數體}
,首先最外層是一對大括號,如果有參數傳入的話,需要聲明參數列表,參數列表的結尾使用一個 -> 符號,表示參數列表的結束與函數體的開始,函數體中可以編寫任意行代碼,並且最後一段代碼會自動作爲Lambda的返回值。
(1)maxBy()函數
工作原理:它接受的是一個Lambda類型的參數,根據我們傳入的條件來遍歷集合,從而找到條件下的最大值。
eg:找出集合中單詞最長的名字:
val list = listOf("王大錘", "愣子", "歐陽瘋子")
var maxLenthName = ""
for (i in list) {
if (i.length > maxLenthName.length) {
maxLenthName = i
}
}
使用集合式API簡化後
val list = listOf("王大錘", "愣子", "歐陽瘋子")
//簡化一
val lambda = { name: String -> name.length }
list.maxBy(lambda)
//簡化二
list.maxBy({ name: String -> name.length })
//簡化三
list.maxBy() { name: String -> name.length }
//簡化四
list.maxBy { name: String -> name.length }
//簡化五
list.maxBy { name -> name.length }
//簡化六
list.maxBy { it.length }
原理:
1.當Lambda參數是函數最後一個參數時,可以將Lambda表達式移到函數括號外面 (二到三)。
2.當Lambda參數勢函數唯一一個參數時,可以將函數的括號省略(三到四)。
3.由於Kotlin擁有出色的類型推導機制,Lambda表達式中的參數列表大多數情況下不必聲明參數類型(四到五)。
4.當Lambda表達式中的參數列表只有一個參數時,不必聲明參數名,可以使用it關鍵字來代替(五到六)。
接下來我們再學習幾個常見的函數式API
(2)map()函數
工作原理:用於將集合中每個元素都映射成一個另外的值,映射規則在Lambda表達式中指定,最終生成一個新的集合。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()函數
工作原理:用來過濾集合中的數據,過濾規則在Lambda表達式中指定,,最終生成一個新的集合,可結合map()函數使用。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()函數與all()函數
any():用於判斷集合中是否至少存在一個元素滿足指定條件。
all():用於判斷集合中是否全部函數都滿足指定條件。
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的函數式API
含義:我們在Kotlin中調用一個Java方法,並且該方法接收一個Java單抽象方法接口參數,就可以使用函數式API。Java單抽象方法接口指的是接口中只有一個待實現的方法,如果接口中有多個待實現的方法,則無法使用函數式API。
舉個栗子:Java中最常見的單抽象方法接口--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()
使用函數式API簡化:
//簡化一
Thread(Runnable {
print("Thread is running")
}).start()
//簡化二
Thread {
print("Thread is running")
}.start()
原理:因爲只有一個待實現方法,我們就算不寫,Kotlin也會明白。另外,如果一個Java參數列表中不存在一個以上Java單抽象方法接口參數,我們還可以將接口名進行省略。
Android中常用的點擊事件接口OnclickListener就是一個單抽象方法接口,就可以使用函數式API
tv.setOnClickListener{
}