本來這節(jié)不應(yīng)該放這里的雹拄,因為在公司做一個小項目練手的時候碰到了些坑耙册,使用了一個List,結(jié)果怎么也找不到添加item的方法烙无,就先惡補了一下锋谐。
首先Kotlin中的集合具有可變性和不可變性的區(qū)別,來看一下Kotlin中的相關(guān)接口:
Iterable | MutableIterable |
---|---|
Collection | MutableCollection |
List | MutableList |
Set | MutableSet |
Map | MutableMap |
首先說明一下截酷,這個表格并不代表繼承關(guān)系涮拗,只是區(qū)分可變不可變。繼承關(guān)系如下圖迂苛,原諒我畫的比較丑:
- Iterable:父類三热。所有可以遍歷的集合都是實現(xiàn)這個接口。只聲明了iterator()一個方法灾部,返回一個Iterator康铭。
- MutableIterable:重寫了父類的iterator()方法,返回一個MutableIterable赌髓。
- Collection:這個類是一個范性集合。僅包含集合是否為空催跪,是否包含某元素等幾個方法锁蠕,有興趣的可以看源碼,是只讀集合懊蒸,不可變荣倾。
- MutableCollection:在Collection的基礎(chǔ)上提供了額外的函數(shù),比如 add 骑丸、 remove 舌仍、 clear 等等妒貌,是可變集合。
- List:它是一個范性有序的集合铸豁。因為它的有序灌曙,我們可以使用 get 函數(shù)通過position來訪問,繼承于Collection节芥,只讀集合在刺。
- MutableList:一個支持增加和刪除item的List,可變集合头镊。
- Set:一個無序并不支持重復(fù)item的集合蚣驼。
- MutableSet:一個支持增加和刪除item的Set。
- Map:一個key-value對的集合相艇。key在map中是唯一的颖杏,也就是說不能有兩對key是一樣的鍵值對存在于一個map中。
- MutableMap:一個支持增加和刪除item的map坛芽。增加了put和remove方法留储。
附上源碼中的結(jié)構(gòu)圖:
另外,kotlin中封裝了很多常用的操作符靡馁,學(xué)會使用的話可以節(jié)省我們很多的代碼量欲鹏。
總數(shù)操作符
any
如果至少有一個元素符合給出的判斷條件,則返回true臭墨。
all
如果全部的元素符合給出的判斷條件赔嚎,則返回true。
count
返回符合給出判斷條件的元素總數(shù)胧弛。
fold
在一個初始值的基礎(chǔ)上從第一項到最后一項通過一個函數(shù)累計所有的元素尤误。
foldRight
與 fold 一樣,但是順序是從最后一項到第一項结缚。
forEach
遍歷所有元素损晤,并執(zhí)行給定的操作。
forEachIndexed
與 forEach 類似红竭,但是我們同時可以得到元素的index尤勋。類似的還有foldIndexed和foldRightIndexed。
max
返回最大的一項茵宪,如果沒有則返回null最冰。min同理。
maxBy
根據(jù)給定的函數(shù)返回最大的一項(返回的是集合本身的元素稀火,而非給定函數(shù)運算過結(jié)果)暖哨,如果沒有則返回null。minBy同理凰狞。
none
如果沒有任何元素與給定的函數(shù)匹配篇裁,則返回true沛慢。
reduce
reduce系列類似fold系列,包括reduceIndexed达布、reduceRight团甲、reduceRightIndexed,只是沒有初始值往枣。
sumBy
返回所有每一項通過函數(shù)轉(zhuǎn)換之后的數(shù)據(jù)的總和伐庭。
val list = listOf(1, 2, 3, 4, 5, 6)
println(list.any { it > 5 })//true
println(list.all { it > 1 })//false
println(list.count { it > 3 })//3
println(list.fold(5) { total, next -> total + next })//5+1+2+3+4+5+6=26
println(list.fold(5) { total, next -> total * next })//5*1*2*3*4*5*6=3600
println(list.fold("5") { total, next -> total + next })//"5"+1+2+3+4+5+6="5123456"
println(list.foldRight(5) { total, next -> total + next })//"5"+1+2+3+4+5+6="5123456"
list.forEach { print(it) }//123456
list.forEachIndexed { index, i -> print("$index:$i,") }//0:1,1:2,2:3,3:4,4:5,5:6,
println(list.max())//6
println(list.maxBy { it * -1 })//1
println(list.none { it > 6 })//true
println(list.reduce { acc, i -> acc + i })//21
println(list.sumBy { it * -1 })//-21
過濾操作符
drop
返回去掉前n個元素的剩余元素的列表。
dropLast
返回去掉后n個元素的剩余元素的列表分冈。
dropWhile
返回根據(jù)給定函數(shù)從第一項開始去掉指定元素的列表圾另。即從前面開始,符合條件的一律去除雕沉,直到碰到一個不符合條件的元素為止集乔。
dropLastWhile
返回根據(jù)給定函數(shù)從最后一項開始去掉指定元素的列表。
filter
過濾所有符合給定函數(shù)條件的元素坡椒。filterIndexed同filter扰路,同時返回索引。
filterNot
過濾所有不符合給定函數(shù)條件的元素倔叼。
filterNotNull
過濾所有元素中不是null的元素汗唱。
slice
過濾一個list中指定index的元素。
take
返回從第一個開始的n個元素丈攒。takeLast從最后一個開始返回n個哩罪。
takeWhile
返回從第一個開始符合給定函數(shù)條件的元素,一旦不符合即停止巡验。takeLastWhile從最后一個開始返回际插。
takeIf
如果滿足條件,則返回這個集合显设,注意參數(shù)it代表的是集合框弛,而非集合中的元素。takeUnless相反捕捂,如果滿足條件瑟枫,則返回null,否則返回集合本身指攒。
val list = listOf(1, 2, 3, 4, 5, 6)
println(list.drop(2))//[3, 4, 5, 6]
println(list.dropLast(2))//[1, 2, 3, 4]
println(list.dropWhile { it > 2 })//[1, 2, 3, 4, 5, 6]
println(list.dropLastWhile { it > 2 })//[1, 2]
println(list.filter { it > 3 })//[4, 5, 6]
println(list.filterIndexed { index, i -> i > 3 && index > 4 })//[6]
println(list.filterNot { it > 3 })//[1, 2, 3]
println(list.filterNotNull())//[1, 2, 3, 4, 5, 6]
println(list.slice(1..2))//[2, 3]
println(list.take(3))//[1, 2, 3]
println(list.takeLast(3))//[4, 5, 6]
println(list.takeWhile { it > 3 })//[]
println(list.takeLastWhile { it > 3 })//[4, 5, 6]
println(list.takeIf { it.isNotEmpty() })//[1, 2, 3, 4, 5, 6]
println(list.takeUnless { it.isNotEmpty() })//null
映射操作符
flatMap
遍歷所有的元素力奋,為每一個創(chuàng)建一個集合,最后把所有的集合放在一個集合中幽七。
groupBy
返回一個根據(jù)給定函數(shù)分組后的map。
map
返回一個每一個元素根據(jù)給定的函數(shù)轉(zhuǎn)換所組成的List溅呢。mapIndexed同理澡屡,同時可以操作每一個元素的索引猿挚。
mapNotNull
返回一個每一個非null元素根據(jù)給定的函數(shù)轉(zhuǎn)換所組成的List。mapIndexedNotNull同理驶鹉。
val list = listOf(1, 2, 3, 4, 5, 6)
println(list.flatMap { listOf(it + 1) })//[2, 3, 4, 5, 6, 7]
println(list.groupBy { it % 2 == 0 })//{false=[1, 3, 5], true=[2, 4, 6]}
println(list.map { it * it })//[1, 4, 9, 16, 25, 36]
println(list.mapNotNull { it?.times(2) })//[2, 4, 6, 8, 10, 12],如果list改為listOf(1, 2, 3, 4, 5, null)绩蜻,則返回[2, 4, 6, 8, 10]
元素操作符
contains
如果指定元素可以在集合中找到,則返回true室埋。
elementAt
返回給定index對應(yīng)的元素办绝,如果index數(shù)組越界則會拋出 IndexOutOfBoundsException 。
elementAtOrElse
返回給定index對應(yīng)的元素姚淆,如果index數(shù)組越界則會根據(jù)給定函數(shù)返回默認(rèn)值孕蝉。
elementAtOrNull
返回給定index對應(yīng)的元素,如果index數(shù)組越界則會返回null腌逢。
first
返回符合給定函數(shù)條件的第一個元素降淮。
firstOrNull
返回符合給定函數(shù)條件的第一個元素,如果沒有符合則返回null搏讶。
indexOf
返回指定元素的第一個index佳鳖,如果不存在,則返回 -1 媒惕。
indexOfFirst
返回第一個符合給定函數(shù)條件的元素的index系吩,如果沒有符合則返回 -1 。
indexOfLast
返回最后一個符合給定函數(shù)條件的元素的index妒蔚,如果沒有符合則返回 -1 穿挨。
last
返回符合給定函數(shù)條件的最后一個元素。
lastIndexOf
返回指定元素的最后一個index面睛,如果不存在絮蒿,則返回 -1 。
lastOrNull
返回符合給定函數(shù)條件的最后一個元素叁鉴,如果沒有符合則返回null土涝。
single
返回符合給定函數(shù)的單個元素,如果沒有符合或者超過一個幌墓,則拋出異常但壮。
singleOrNull
返回符合給定函數(shù)的單個元素,如果沒有符合或者超過一個常侣,則返回null蜡饵。
這一部分與java中的集合操作類似,基本看字面就可以理解什么意思胳施,應(yīng)該也是最常用的一些操作符了溯祸。
生產(chǎn)操作符
partition
把一個給定的集合分割成兩個,第一個集合是由原集合每一項元素匹配給定函數(shù)條件返回 true 的元素組成,第二個集合是由原集合每一項元素匹配給定函數(shù)條件返回 false 的元素組成焦辅。
plus
返回一個包含原集合和給定集合中所有元素的集合博杖,因為函數(shù)的名字原因,我們可以使用 + 操作符筷登。
zip
返回由 pair 組成的List剃根,每個 pair 由兩個集合中相同index的元素組成。這個返回的List的大小由最小的那個集合決定前方。
unzip
從包含pair的List中生成包含List的Pair狈醉。
val list1 = listOf(1, 2, 3)
val list2 = listOf(4, 5, 6)
println(list1.partition { it % 2 == 0 })//([2], [1, 3])
println(list1.plus(list2))//[1, 2, 3, 4, 5, 6]
println(list1 + list2)//[1, 2, 3, 4, 5, 6]
println(list1.zip(list2))//[(1, 4), (2, 5), (3, 6)]
println(listOf(Pair(1, 2), Pair(3, 4)).unzip())//([1, 3], [2, 4])
順序操作符
reverse
返回一個與原list反序的list。
sort
返回一個原list升序排列后的list惠险。
sortBy
返回一個根據(jù)指定函數(shù)升序排序后的list苗傅。
sortDescending
返回一個原list降序排序后的List。
sortDescendingBy
返回一個根據(jù)指定函數(shù)降序排序后的list。
val list = listOf(1, 2, 3, 4, 5, 6)
println(list.reversed())//[6, 5, 4, 3, 2, 1]
println(list.sorted())//[1, 2, 3, 4, 5, 6]
println(list.sortedBy { it % 6 })//[6, 1, 2, 3, 4, 5]
println(list.sortedDescending())//[6, 5, 4, 3, 2, 1]
println(list.sortedByDescending { it % 6 })//[5, 4, 3, 2, 1, 6]
注意上述所有操作符的測試環(huán)境為List,而非MutableList众羡,即上述操作符并不會改變原集合本身。