Kotlin學(xué)習(xí)筆記(二)集合

本來這節(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)系如下圖迂苛,原諒我畫的比較丑:

Kotlin集合繼承關(guān)系.jpg
  • 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)圖:
1.png
2.png
3.png
4.png

另外,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众羡,即上述操作符并不會改變原集合本身。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摇庙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子遥缕,更是在濱河造成了極大的恐慌卫袒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件单匣,死亡現(xiàn)場離奇詭異夕凝,居然都是意外死亡,警方通過查閱死者的電腦和手機户秤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門码秉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸡号,你說我怎么就攤上這事转砖。” “怎么了鲸伴?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵府蔗,是天一觀的道長。 經(jīng)常有香客問我汞窗,道長姓赤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任仲吏,我火速辦了婚禮不铆,結(jié)果婚禮上蝌焚,老公的妹妹穿的比我還像新娘。我一直安慰自己狂男,他們只是感情好综看,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岖食,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舞吭。 梳的紋絲不亂的頭發(fā)上泡垃,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音羡鸥,去河邊找鬼蔑穴。 笑死,一個胖子當(dāng)著我的面吹牛惧浴,可吹牛的內(nèi)容都是我干的存和。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衷旅,長吁一口氣:“原來是場噩夢啊……” “哼捐腿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柿顶,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤茄袖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嘁锯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宪祥,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年家乘,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝗羊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡仁锯,死狀恐怖耀找,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扑馁,我是刑警寧澤涯呻,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站腻要,受9級特大地震影響复罐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雄家,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一效诅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦乱投、人聲如沸咽笼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剑刑。三九已至,卻和暖如春双肤,著一層夾襖步出監(jiān)牢的瞬間施掏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工茅糜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留七芭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓蔑赘,卻偏偏與公主長得像狸驳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缩赛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容