Kotlin搞起來——3.集合與它的操作符們


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,可以看到 CollectionMutableCollection
給我們提供的方法:

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

Map 則是:

,然后提供的方法與參數(shù)如下:

整個(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)為止

使用示例

結(jié)果


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的元素)

使用示例

結(jié)果


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;

使用示例

結(jié)果


4)順序操作符

同樣,操作符也不多,只有五個(gè),都是和元素排序相關(guān)的!


  • reversed —— 相反順序
  • sorted —— 自然排序(升序)
  • sortedBy —— 根據(jù)方法處理結(jié)果進(jìn)行自然(升序)排序
  • sortedDescending —— 降序排序
  • sortedByDescending —— 根據(jù)方法處理結(jié)果進(jìn)行降序排序

使用示例

結(jié)果


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

使用示例

結(jié)果


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é)

本節(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


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,996評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,991評論 2 374

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