Kotlin學習路(一):集合使用

<本文學習郭神《第三行代碼》總結>

集合主要就是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 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章