<本文學習郭神《第三行代碼》總結>
集合主要就是List、Set、Map,它們在Java中都有接口可以實現,
List --> ArrayList、LinkedList
Set --> HashSet
Map–> HashMap
1、List集合初始化
在Kotlin中初始化集合一般這樣做:
val list = ArrayList<String>()
list.add("1")
list.add("2")
這種很繁瑣,所以這裏將會介紹list的幾個方法:listof()、mutableListOf()
val list = listOf("aa", "bb")
val list = mutableListOf("aa", "bb")
listof():創建的是一個不可變的集合,該集合創建成功只能用於讀取數據,不能增刪改集合數據。
mutableListOf():創建的是一個可變的集合,可以進行增刪改查操作。
遍歷List集合需要使用for-in循環進行遍歷,比如:
fun main(){
val list1 = listOf("aa", "bb")
for (content in list1){
content.toUpperCase()//把遍歷內容大寫
print(content)
}
val list2 = mutableListOf("aa", "bb")
list2.add("cc")
for (content in list2){
content.toUpperCase()//把遍歷內容大寫
print(content)
}
}
2、Set集合
Set和List的用法其實一樣,在初始化時會用到這幾個方法:setof()、mutableSetOf()
val set = setOf("aa", "bb")
val set = mutableSetOf("aa", "bb")
setof():創建的是一個不可變的集合,該集合創建成功只能用於讀取數據,不能增刪改集合數據。
mutableSetOf():創建的是一個可變的集合,可以進行增刪改查操作。
在這裏,Set集合List集合的區別需要注意的是,Set底層是使用Hash映射機制來存儲數據的,因此集合中的元素無法保證有序。
----遍歷和List一樣,就不做解釋了
3、Map集合初始化
Map集合這裏重點介紹,Map和前兩者不同,Map是一種鍵值對形式的數據結構,因此在用法上和List、Set存在很大不同。
一般初始化Map時都需要創建一個HashMap
val map = HashMap<String, String>()
map.put("aa", "1")
map.put("bb", "2")
因爲在Kotlin中,並不建議使用put()、get()方法對Map進行添加和讀取數據,而是使用這種類似下標的方式添加數據:
val map = HashMap<String, String>()
map["aa"] = 1
map["bb"] = 2
當讀取數據時
val text = map["aa"]
然而,上面這種添加數據方式依然很繁瑣,和List、Set一樣,Map也有自己的方法mapof()、mutableMapOf()
val map1 = mapOf("aa" to 1, "bb" to 2) //不可變
val map2 = mutableMapOf("aa" to 1, "bb" to 2) //可變
mapof():創建的是一個不可變的集合,該集合創建成功只能用於讀取數據,不能增刪改集合數據。
mutableMapOf():創建的是一個可變的集合,可以進行增刪改查操作。
遍歷Map集合,也是使用的for-in循環,唯一區別在於,for-in循環中,map鍵值對變量一起申明到了一對括號中
fun main(){
val map1 = mapOf("aa" to 1, "bb" to 2)
for ((content1, content2) in map1){
print(content1 + "--" + content2)
}
}
4、集合函數式API(lambda)
首先定義一個集合,然後找出裏面長度最長的元素
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = ""
for (content in list1){
if (content.length > maxLength.length){
maxLength = content
}
}
print(maxLength)
傳統方式一般是這樣寫的,但是對於集合的函數式API,可以讓這個功能更簡介
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = list1.maxBy { it.length }
print(maxLength)
這就是函數API的用法,只是一行代碼就可以搞定。
接下來就看一下它的推導過程:
首先我們先了解一下lambda表達式結構:
{ 參數名1:參數類型, 參數名2:參數類型 -> 函數體 }
最外面一個大括號,如果有參數值傳入表達式中,則需要申明參數,參數列表結尾 -> ,標識參數列表的結束以及函數體的開始,函數體中可編寫任意代碼。
現在回到前面,首先maxBy的工作原理是根據傳入的條件來進行遍歷,從而找打最大值,所以,套用Lambda函數表達式就可以寫成:
val list1 = listOf("aa", "bbbb", "cc")
var lambda = { content :String -> content.length }
var maxLength = list1.maxBy ( lambda )
print(maxLength)
maxBy函數實質上是接收了一個lambda參數,
其次,在開發中不需要特地定義一個lambda變量,可以直接將lambda表達式傳入maxBy函數中,
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = list1.maxBy( { content :String -> content.length })
print(maxLength)
在Kotlin規定中,當Lambda參數是函數的最後一個參數時,可以將Lambda表達式移到括號外,
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = list1.maxBy() { content :String -> content.length }
print(maxLength)
如果Lambda參數時函數唯一一個參數時,可以將括號省略,
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = list1.maxBy { content :String -> content.length }
print(maxLength)
由於Kotlin中的類型推導機制,Lambda表達式在大多數情況下不必申明參數類型,
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = list1.maxBy { content -> content.length }
print(maxLength)
最後,當Lambda表達式的參數列表中只有一個參數時,也不必申明參數名,可以直接使用關鍵字 it 代替,
val list1 = listOf("aa", "bbbb", "cc")
var maxLength = list1.maxBy { it.length }
print(maxLength)
5、常用的集合函數式API
(1)、map()函數
它用於將每個元素都映射成一個另外的值,映射規則在Lambda表達式中指定,最終生成一個新的集合,
val list1 = listOf("aa", "bb")
var newList = list1.map{ it.toUpperCase()}
for (content in list1){
content.toUpperCase() //轉換成大寫模式
}
(2)、filter()函數
用於過濾集合中的數據,可以單獨使用,也可以和map()一起使用
val list1 = listOf("aa", "bbbb", "cc")
var list2 = list1.filter { it.length <= 2 }
.map { it.toUpperCase() }
(3)、any()函數
判斷集合中是否至少存在一個元素滿足指定條件
val list1 = listOf("aa", "bbbb", "cc")
var anyResult = list1.any { it.length <= 2 }
(4)、all()函數
判斷集合中是否所有元素都滿足指定條件
val list1 = listOf("aa", "bbbb", "cc")
var allResult = list1.all { it.length <= 2 }