1.Kotlin中的集合介紹

好的,本節(jié)我們繼續(xù)來搞Kotlin,這節(jié)要搞的是: **Kotlin中的集合與它的操作符們**
集合在我們實(shí)際開發(fā)中用的還是比較頻繁的,Kotlin中的集合不同于Java中的集合,
Kotlin中的集合根據(jù)“是否可變”,分為兩派:不可變集合與可變集合,而后者是
在前者的前面加上了 Mutable :
- 列表:List/MutableList;
- 集:Set/MutableSet;
- 映射:Map/MutableMap;
- 集合:Collection/MutableCollection;
- 迭代器:Iterable/MutableIterable;
關(guān)于可變不可變,其實(shí)看看這些類提供的方法就知道了(提供的讀寫相關(guān)的方法)
我們可以打開kotlin-runtime-sources.jar包中的kotlin包,里面有個(gè)
Collections.kt的文件,這里不對方法進(jìn)行講解,基本都是見名知意,
打開這個(gè)文件后,點(diǎn)擊AS左側(cè)的Structure視圖,來看看都有些什么?
首先是:Iterable接口,兩個(gè)接口中都只有一個(gè)iterator()方法:

改方法返回一個(gè)Iterator,我們到Iterator.kt里看看,定義了四個(gè)接口,
以及對應(yīng)的方法,這就是當(dāng)我們對集合進(jìn)行循環(huán)迭代遍歷時(shí)可供調(diào)用的一些方法!

接著看回Collections.kt,可以看到 Collection 和 MutableCollection
給我們提供的方法:

再接著是實(shí)現(xiàn)了Collection接口的 List 和 Set,除了重寫Collection中的方法
外還新增了一些方法:




而 Map 則是:



整個(gè)文件的大概結(jié)構(gòu)就是這樣,方法也不細(xì)講了,都是見名知意的!
2.創(chuàng)建集合
List

Set

Map
這的鍵值對用 to 關(guān)鍵字,key to value!

3.強(qiáng)勢的集合操作符們
Kotlin中關(guān)于集合的操作符有六類:
- 總數(shù)操作符
- 過濾操作符
- 映射操作符
- 順序操作符
- 生產(chǎn)操作符
- 元素操作符
下面我們一一來對這些操作符進(jìn)行講解!

1)總數(shù)操作符
- any —— 判斷集合中 是否有滿足條件 的元素;
- all —— 判斷集合中的元素 是否都滿足條件;
- none —— 判斷集合中是否 都不滿足條件,是則返回true;
- count —— 查詢集合中 滿足條件 的 元素個(gè)數(shù);
- reduce —— 從 第一項(xiàng)到最后一項(xiàng)進(jìn)行累計(jì) ;
- reduceRight —— 從 最后一下到第一項(xiàng)進(jìn)行累計(jì);
- fold —— 與reduce類似,不過有初始值,而不是從0開始累計(jì);
- foldRight —— 和reduceRight類似,有初始值,不是從0開始累計(jì);
- forEach —— 循環(huán)遍歷元素,元素是it,可對每個(gè)元素進(jìn)行相關(guān)操作;
- forEachIndexed —— 循環(huán)遍歷元素,同時(shí)得到元素index(下標(biāo));
- max —— 查詢最大的元素,如果沒有則返回null;
- maxBy —— 獲取方法處理后返回結(jié)果最大值對應(yīng)的那個(gè)元素的初始值,如果沒有則返回null;
- min —— 查詢最小的元素,如果沒有則返回null;
- minBy —— 獲取方法處理后返回結(jié)果最小值對應(yīng)那個(gè)元素的初始值,如果沒有則返回null;
- sumBy —— 獲取 方法處理后返回結(jié)果值 的 總和;
- dropWhile —— 返回從第一項(xiàng)起,去掉滿足條件的元素,直到不滿足條件的一項(xiàng)為止
使用示例:


2)過濾操作符
見名知意,通過 某個(gè)條件 來對集合中的元素進(jìn)行過濾,取其精華去其糟粕~
PS:過濾后會(huì)返回一個(gè)處理后的列表結(jié)果,但不會(huì)改變原列表!!!
- filter —— 過濾 掉所有 滿足條件 的元素
- filterNot —— 過濾所有不滿足條件的元素
- filterNotNull —— 過濾NULL
- take —— 返回從第一個(gè)開始的n個(gè)元素
- takeLast —— 返回從最后一個(gè)開始的n個(gè)元素
- takeWhile —— 返回不滿足條件的下標(biāo)前面的所有元素的集合
- drop —— 返回 去掉前N個(gè)元素后 的列表
- dropLastWhile —— 返回從最后一項(xiàng)起,去掉滿足條件的元素,直到不滿足條件的一項(xiàng)為止
-
slice —— 過濾掉 非指定下標(biāo) 的元素,即保留下標(biāo)對應(yīng)的元素過濾list中
指定下標(biāo)的元素(比如這里只保留下標(biāo)為1,3,4的元素)
使用示例:


3)映射操作符
這里的話,因?yàn)椴僮鞣挥形鍌€(gè),就不一個(gè)個(gè)分開了,直接解釋一波后,
貼代碼和運(yùn)行結(jié)果~
- map —— 將集合中的元素通過某個(gè) 方法轉(zhuǎn)換 后的結(jié)果存到一個(gè)集合中;
- mapIndexed —— 除了得到 轉(zhuǎn)換后的結(jié)果 ,還可以拿到Index(下標(biāo));
- mapNotNull —— 執(zhí)行方法 轉(zhuǎn)換前過濾掉 為 NULL 的元素
- flatMap —— 合并兩個(gè)集合,可以在合并的時(shí)候做些小動(dòng)作;
- groupBy —— 將集合中的元素按照某個(gè)條件分組,返回Map;
使用示例:


4)順序操作符
同樣,操作符也不多,只有五個(gè),都是和元素排序相關(guān)的!
- reversed —— 相反順序
- sorted —— 自然排序(升序)
- sortedBy —— 根據(jù)方法處理結(jié)果進(jìn)行自然(升序)排序
- sortedDescending —— 降序排序
- sortedByDescending —— 根據(jù)方法處理結(jié)果進(jìn)行降序排序
使用示例:


5)生產(chǎn)操作符
生產(chǎn)操作符只有四個(gè),不是五個(gè),看到網(wǎng)上相關(guān)的都說有五個(gè),還有一個(gè)是:merge,
作用是:把兩個(gè)集合,按照相同下標(biāo),合成新的元素,合成的集合大小由最小的集合決定!
然而,這個(gè)方法在Kotlin 1.0 Beta 2后的版本,就棄用了這個(gè)操作符,具體可見:傳送門
當(dāng)然有替代方案,可以使用 zip 操作符來實(shí)現(xiàn)這個(gè)功能!示例代碼會(huì)給出~
另外,這節(jié)的操作符涉及到一個(gè) Pair 的類,該類是Kotlin提供的用來處理雙元對數(shù)據(jù)的,
可以理解成Map中的一個(gè)鍵值對,比如Pair("key","value") 等價(jià)于 "key" to "value"
- zip —— 兩個(gè)集合按照下標(biāo)組合成一個(gè)個(gè)的Pair塞到集合中返回
- partition —— 根據(jù)判斷條件是否成立,拆分成兩個(gè) Pair
- plus —— 合并兩個(gè)List,可以用"+"替代
- unzip —— 將包含多個(gè)Pair的List 轉(zhuǎn)換成 含List的Pair
使用示例:


6)元素操作符
- contains —— 判斷集合中是否有指定元素,有返回true
- elementAt —— 查找下標(biāo)對應(yīng)的元素,如果下標(biāo)越界會(huì)拋IndexOutOfBoundsException
- elementAtOrElse —— 查找下標(biāo)對應(yīng)元素,如果越界會(huì)根據(jù)方法返回默認(rèn)值(最大下標(biāo)經(jīng)方法后的值)
- elementAtOrNull —— 查找下標(biāo)對應(yīng)元素,越界會(huì)返回Null
- first —— 返回符合條件的第一個(gè)元素,沒有 拋NoSuchElementException
- firstOrNull —— 返回符合條件的第一個(gè)元素,沒有 返回null
- indexOf —— 返回指定下標(biāo)的元素,沒有 返回-1
- indexOfFirst —— 返回第一個(gè)符合條件的元素下標(biāo),沒有 返回-1
- indexOfLast —— 返回最后一個(gè)符合條件的元素下標(biāo),沒有 返回-1
- last —— 返回符合條件的最后一個(gè)元素,沒有 拋NoSuchElementException
- lastIndexOf —— 返回符合條件的最后一個(gè)元素,沒有 返回-1
- lastOrNull —— 返回符合條件的最后一個(gè)元素,沒有 返回null
- single —— 返回符合條件的單個(gè)元素,如有沒有符合或超過一個(gè),拋異常
- singleOrNull —— 返回符合條件的單個(gè)元素,如有沒有符合或超過一個(gè),返回null
使用示例


本節(jié)小結(jié)
本節(jié)對Kotlin中的集合與相關(guān)操作符進(jìn)行了詳細(xì)的講解,此文經(jīng)過多次排版,我覺得
先描述操作符 -> 使用示例 -> 運(yùn)行結(jié)果,這樣應(yīng)該是最清晰的了,
希望能幫助你更快掌握這些操作符!當(dāng)然還是那句話:
不要去死記操作符,用到的時(shí)候再查
可以把本文收藏了或者點(diǎn)個(gè)喜歡,想查什么就查什么!
另外:
吐槽下網(wǎng)上很多關(guān)于kotlin的文章都是直接復(fù)制的kotlin-for-android-developers-zh,
有些操作符說得模棱兩可,而且就貼短,代碼,運(yùn)行生成什么也不知道,
還有些地方是寫錯(cuò)的,只能說服...本系列的代碼都是自己寫,測試運(yùn)行過的,
盡管很耗時(shí)而且繁瑣,但是我還是堅(jiān)持,當(dāng)然,一個(gè)人力量有限,可能還有些錯(cuò)漏,
歡迎指出,萬分感謝~

本節(jié)參考文獻(xiàn)如下:
Kotlin官方文檔
kotlin-for-android-developers-zh
Kotlinのリスト操作関數(shù)まとめ
** 修改日志**:
- 2017.1.17 感謝翔神指出的語義錯(cuò)誤,已修正:
Kotlin中的集合根據(jù)“是否可變”,分為兩派:不可變集合與可變集合,而后者是
在前者的前面加上了 Mutable