快速學習Kotlin(七)集合與操作符
集合是我們在程式碼編寫時常用的操作資料的方式之一,具有非常重要的作用。
在kotlin中也有集合的概念,kotlin中的集合一般有三種:List、Map以及Set三種。而這三種集合每種又可以分為可變集合與不可變集合兩種。
不可變集合
顧名思義,不可變集合就是集合在初始化時已經將元素放入集合當中去,之後只能對集合中的元素進行檢視和遍歷,不能對其進行新增、修改和刪除。
var list = listOf<String>("A","B","C","D"); var set = setOf<String>("a","b","c","d","e"); var map = mapOf<Int,String>(1 to "aa",2 to "bb",3 to "cc",4 to "dd",5 to "dd");
在kotlin中並沒有宣告為集合的函式,所以我們不能像Java中那樣直接使用ArrayList或者HashMap這樣來宣告一個集合。而是應該改用listof、setof和mapof等方法來宣告一個集合。並且用這種方式宣告的集合都是不能變集合,我們在宣告的同時就在括號中將其初始值新增進去,之後便可以直接遍歷取出這些值。
可變集合
絕大多數情況下,我們在操作集合的時候都不是一層不變的,很多時候都是在對集合中的資料進行增刪改查,那麼該如何操作呢?這個時候就必須使用到可變集合。
var list = mutableListOf<String>(); list.add("A"); list.add("B"); list.add("C"); list.get(0); list.get(1) list.removeAt(0); var set = mutableSetOf<Int>(); set.add(1); set.add(2); set.remove(0); var size = set.size var map = mutableMapOf<Int,String>(); map.put(1,"aa"); map.put(2,"bb"); var value = map.get(1)
當我們把集合宣告為mutableListOf、mutableSetOf和mutableMapOf時,集合就變成了一個可變集合。我們可以對集合進行像Java一樣增刪改查的操作。
此外如果你想對Map進行操作,kotlin也提供各種不同的map來進行資料的操作。
- hashMapOf()——建立一個hashMap
- linkedMapOf()——建立一個linkedMap
- sortedMapOf()——建立一個sortedMap
另外在對可變集合在宣告的時候也可以進行初始化操作,如果不進行初始化則預設為一個空集合。
var list = mutableListOf<String>("Q","W","E"); var set = mutableSetOf<Int>(1,2,3,4); var map = mutableMapOf<Int,String>(1 to "aa",2 to "bb");
集合的遍歷
有些時候我們會需要去取出集合中的所有元素,對不同元素進行不同的操作。這時候就需要對集合進行遍歷操作。下面列出集中集合遍歷的方式來提供參考。
-
list集合遍歷
var list:List<String> = listOf<String>("a","b","c","d","e","f","g","h","i");
var value:String;
//第一種遍歷方式
for (value in list){
println("集合遍歷結果:$value");
}
//第二種遍歷方式
list.forEach {
println("集合遍歷結果:$it")
}
//遍歷結果
集合遍歷結果:a
集合遍歷結果:b
集合遍歷結果:c
集合遍歷結果:d
集合遍歷結果:e
集合遍歷結果:f
集合遍歷結果:g
集合遍歷結果:h
集合遍歷結果:i
這兩種遍歷list集合輸出的結果都是一樣的。但是假設我們此時還需要同時輸出集合下角標和元素值,那麼又當如何遍歷?這裡寫出第三種遍歷方式,可以同時遍歷下角標和元素值
var list:List<String> = listOf<String>("a","b","c","d","e","f","g","h","i");
var value:String;
for ((index,value) in list.withIndex()){
println("角標為$index,元素值為$value");
}
//遍歷結果
角標為0,元素值為a
角標為1,元素值為b
角標為2,元素值為c
角標為3,元素值為d
角標為4,元素值為e
角標為5,元素值為f
角標為6,元素值為g
角標為7,元素值為h
角標為8,元素值為i
看到,這裡使用瞭解構的方式來遍歷整個集合,從而達到可以同時遍歷下角標和元素內容的目的。
-
Map集合遍歷
var map:Map<String,String> = mapOf("1" to "a","2" to "b","3" to "c","4" to "d","5" to "e");
//第一種遍歷集合方式
map.forEach {
println("集合的key為${it.key},集合的value為${it.value};");
};
//第二種解構遍歷集合方式
for ((key,value) in map){
println("集合的key為${key},集合的value為${value};");
}
//遍歷結果
集合的key為1,集合的value為a;
集合的key為2,集合的value為b;
集合的key為3,集合的value為c;
集合的key為4,集合的value為d;
集合的key為5,集合的value為e;
操作符
熟悉RxJava的都知道,RxJava之所以強大的地方在於其擁有很多非常好用的操作符,這些操作符大大節約了我們程式設計的難度方便了我們的開發。在kotlin中集合裡面也有很多操作符。下面我來列舉幾個常用的操作符。
-
any
說明:如果至少有一個元素符合判斷條件,則返回true,否則false,例:
val list = listOf(1, 2, 3, 4, 5)
list.any { it > 10 }
結果為false
-
all
說明:如果集合中所有的元素都符合判斷條件,則返回true否則false,例:
val list = listOf(1, 2, 3, 4, 5)
list.any { it < 10 }
結果為true
-
count
說明:返回集合中符合判斷條件的元素總數。例:
val list = listOf(1, 2, 3, 4, 5)
list.count { it <3 }
結果為2
-
forEach
說明:遍歷所有元素,並執行給定的操作(類似於Java 中的for迴圈)。例:
val list = listOf(1, 2, 3, 4, 5)
list.forEach{ Log.i(TAG,it.toString()) }
結果為:1 2 3 4 5
-
forEachIndexed
說明:與forEach作用一樣,但是同時可以得到元素的index。例:
val list = listOf(1, 2, 3, 4, 5)
list.forEachIndexed { index, i -> Log.i(TAG, "index:" + index + " value:" + i.toString()) }
結果為
index:0 value:1
index:1 value:2
index:2 value:3
index:3 value:4
index:4 value:5
-
drop
說明:返回去掉前n個元素的列表。例:
val list = listOf(1, 2, 3, 4, 5)
var s = list.drop(2)
s.forEach {
Log.i(TAG, it.toString())
}
結果為 :3 4 5(去掉了前兩個元素)
-
filter
說明:過濾所有符合給定函式條件的元素。例:
list.filter { it > 2 }
結果為:3 4 5
-
flatMap
說明:遍歷所有的元素,為每一個建立一個集合,最後把所有的集合放在一個集合中。例:
list.flatMap { listOf(it, it + 1) }
結果為: 1 2 2 3 3 4 4 5 5 6(每個元素都執行加1後作為一個新元素)
-
map
說明:返回一個每一個元素根據給定的函式轉換所組成的集合。例:
list.map { it * 2 }
結果為:2 4 6 8 10
-
zip
說明:返回由pair組成的List,每個pair由兩個集合中相同index的元素組成。這個返回的List的大小由最小的那個集合決定。例:
list.zip(listOf(7, 8))
結果為:(1, 7) (2, 8)
-
first
說明:返回符合給定函式條件的第一個元素。例:
list.first { it > 2 }
結果為:3
-
last
說明:返回符合給定函式條件的最後一個元素。例:
list.last { it % 2 == 0 }
結果為:4
如果覺得我的文章能夠幫助到你,也歡迎關注我的微信公眾號「晨雨細曲」,有新技術和知識會推送在這上面。