快速學(xué)習(xí)Kotlin(七)集合操作符

Kotlin

集合是我們?cè)诖a編寫時(shí)常用的操作數(shù)據(jù)的方式之一邮旷,具有非常重要的作用。

在kotlin中也有集合的概念,kotlin中的集合一般有三種:List傲霸、Map以及Set三種。而這三種集合每種又可以分為可變集合與不可變集合兩種眉反。

不可變集合

顧名思義昙啄,不可變集合就是集合在初始化時(shí)已經(jīng)將元素放入集合當(dāng)中去,之后只能對(duì)集合中的元素進(jìn)行查看和遍歷寸五,不能對(duì)其進(jìn)行添加梳凛、修改和刪除。

        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中并沒有聲明為集合的函數(shù)梳杏,所以我們不能像Java中那樣直接使用ArrayList或者HashMap這樣來聲明一個(gè)集合韧拒。而是應(yīng)該改用listof、setof和mapof等方法來聲明一個(gè)集合十性。并且用這種方式聲明的集合都是不能變集合叛溢,我們?cè)诼暶鞯耐瑫r(shí)就在括號(hào)中將其初始值添加進(jìn)去,之后便可以直接遍歷取出這些值劲适。

可變集合

絕大多數(shù)情況下楷掉,我們?cè)诓僮骷系臅r(shí)候都不是一層不變的,很多時(shí)候都是在對(duì)集合中的數(shù)據(jù)進(jìn)行增刪改查霞势,那么該如何操作呢烹植?這個(gè)時(shí)候就必須使用到可變集合斑鸦。

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)

當(dāng)我們把集合聲明為mutableListOf、mutableSetOf和mutableMapOf時(shí)草雕,集合就變成了一個(gè)可變集合巷屿。我們可以對(duì)集合進(jìn)行像Java一樣增刪改查的操作。

此外如果你想對(duì)Map進(jìn)行操作促绵,kotlin也提供各種不同的map來進(jìn)行數(shù)據(jù)的操作攒庵。

  • hashMapOf()——?jiǎng)?chuàng)建一個(gè)hashMap
  • linkedMapOf()——?jiǎng)?chuàng)建一個(gè)linkedMap
  • sortedMapOf()——?jiǎng)?chuàng)建一個(gè)sortedMap

另外在對(duì)可變集合在聲明的時(shí)候也可以進(jìn)行初始化操作,如果不進(jìn)行初始化則默認(rèn)為一個(gè)空集合败晴。

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");

集合的遍歷

有些時(shí)候我們會(huì)需要去取出集合中的所有元素浓冒,對(duì)不同元素進(jìn)行不同的操作。這時(shí)候就需要對(duì)集合進(jìn)行遍歷操作尖坤。下面列出集中集合遍歷的方式來提供參考稳懒。

  • list集合遍歷

    var list:List<String> = listOf<String>("a","b","c","d","e","f","g","h","i");
    var value:String;

    //第一種遍歷方式
    for (value in list){
        println("集合遍歷結(jié)果:$value");
    }

    //第二種遍歷方式
    list.forEach {
        println("集合遍歷結(jié)果:$it")
    }

    //遍歷結(jié)果
    集合遍歷結(jié)果:a
    集合遍歷結(jié)果:b
    集合遍歷結(jié)果:c
    集合遍歷結(jié)果:d
    集合遍歷結(jié)果:e
    集合遍歷結(jié)果:f
    集合遍歷結(jié)果:g
    集合遍歷結(jié)果:h
    集合遍歷結(jié)果:i

這兩種遍歷list集合輸出的結(jié)果都是一樣的。但是假設(shè)我們此時(shí)還需要同時(shí)輸出集合下角標(biāo)和元素值慢味,那么又當(dāng)如何遍歷场梆?這里寫出第三種遍歷方式,可以同時(shí)遍歷下角標(biāo)和元素值

    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("角標(biāo)為$index,元素值為$value");
    }

    //遍歷結(jié)果
    角標(biāo)為0,元素值為a
    角標(biāo)為1,元素值為b
    角標(biāo)為2,元素值為c
    角標(biāo)為3,元素值為d
    角標(biāo)為4,元素值為e
    角標(biāo)為5,元素值為f
    角標(biāo)為6,元素值為g
    角標(biāo)為7,元素值為h
    角標(biāo)為8,元素值為i

看到纯路,這里使用了解構(gòu)的方式來遍歷整個(gè)集合或油,從而達(dá)到可以同時(shí)遍歷下角標(biāo)和元素內(nè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};");

        };

        //第二種解構(gòu)遍歷集合方式
        for ((key,value) in map){

            println("集合的key為${key}顶岸,集合的value為${value};");

        }

        //遍歷結(jié)果
        集合的key為1,集合的value為a;
        集合的key為2叫编,集合的value為b;
        集合的key為3辖佣,集合的value為c;
        集合的key為4,集合的value為d;
        集合的key為5搓逾,集合的value為e;

操作符

熟悉RxJava的都知道卷谈,RxJava之所以強(qiáng)大的地方在于其擁有很多非常好用的操作符,這些操作符大大節(jié)約了我們編程的難度方便了我們的開發(fā)霞篡。在kotlin中集合里面也有很多操作符世蔗。下面我來列舉幾個(gè)常用的操作符。

  • any

說明:如果至少有一個(gè)元素符合判斷條件寇损,則返回true凸郑,否則false,例:

val list = listOf(1, 2, 3, 4, 5)
list.any { it > 10 }

結(jié)果為false

  • all

說明:如果集合中所有的元素都符合判斷條件,則返回true否則false,例:

val list = listOf(1, 2, 3, 4, 5)
list.any { it < 10 }

結(jié)果為true

  • count

說明:返回集合中符合判斷條件的元素總數(shù)矛市。例:

val list = listOf(1, 2, 3, 4, 5)
list.count { it <3 }

結(jié)果為2

  • forEach

說明:遍歷所有元素芙沥,并執(zhí)行給定的操作(類似于Java 中的for循環(huán))。例:

val list = listOf(1, 2, 3, 4, 5)
list.forEach{ Log.i(TAG,it.toString()) }

結(jié)果為:1 2 3 4 5

  • forEachIndexed

說明:與forEach作用一樣,但是同時(shí)可以得到元素的index而昨。例:

val list = listOf(1, 2, 3, 4, 5)
list.forEachIndexed { index, i -> Log.i(TAG, "index:" + index + " value:" + i.toString()) }

結(jié)果為
index:0 value:1
index:1 value:2
index:2 value:3
index:3 value:4
index:4 value:5

  • drop

說明:返回去掉前n個(gè)元素的列表救氯。例:

val list = listOf(1, 2, 3, 4, 5)
var s = list.drop(2)
s.forEach {
Log.i(TAG, it.toString())
}

結(jié)果為 :3 4 5(去掉了前兩個(gè)元素)

  • filter

說明:過濾所有符合給定函數(shù)條件的元素。例:

list.filter { it > 2 }

結(jié)果為:3 4 5

  • flatMap

說明:遍歷所有的元素歌憨,為每一個(gè)創(chuàng)建一個(gè)集合着憨,最后把所有的集合放在一個(gè)集合中。例:

list.flatMap { listOf(it, it + 1) }

結(jié)果為: 1 2 2 3 3 4 4 5 5 6(每個(gè)元素都執(zhí)行加1后作為一個(gè)新元素)

  • map

說明:返回一個(gè)每一個(gè)元素根據(jù)給定的函數(shù)轉(zhuǎn)換所組成的集合务嫡。例:

list.map { it * 2 }

結(jié)果為:2 4 6 8 10

  • zip

說明:返回由pair組成的List甲抖,每個(gè)pair由兩個(gè)集合中相同index的元素組成。這個(gè)返回的List的大小由最小的那個(gè)集合決定心铃。例:

list.zip(listOf(7, 8))

結(jié)果為:(1, 7) (2, 8)

  • first

說明:返回符合給定函數(shù)條件的第一個(gè)元素准谚。例:

list.first { it > 2 }

結(jié)果為:3

  • last

說明:返回符合給定函數(shù)條件的最后一個(gè)元素。例:

list.last { it % 2 == 0 }

結(jié)果為:4
如果覺得我的文章能夠幫助到你去扣,也歡迎關(guān)注我的微信公眾號(hào)「晨雨細(xì)曲」柱衔,有新技術(shù)和知識(shí)會(huì)推送在這上面。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愉棱,一起剝皮案震驚了整個(gè)濱河市唆铐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奔滑,老刑警劉巖艾岂,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朋其,居然都是意外死亡澳盐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門令宿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腕窥,你說我怎么就攤上這事粒没。” “怎么了簇爆?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵癞松,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我入蛆,道長(zhǎng)响蓉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任哨毁,我火速辦了婚禮枫甲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己想幻,他們只是感情好粱栖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脏毯,像睡著了一般闹究。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食店,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天渣淤,我揣著相機(jī)與錄音,去河邊找鬼吉嫩。 笑死价认,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的率挣。 我是一名探鬼主播刻伊,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椒功!你這毒婦竟也來了捶箱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤动漾,失蹤者是張志新(化名)和其女友劉穎丁屎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旱眯,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晨川,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了删豺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片共虑。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呀页,靈堂內(nèi)的尸體忽然破棺而出妈拌,到底是詐尸還是另有隱情,我是刑警寧澤蓬蝶,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布尘分,位于F島的核電站,受9級(jí)特大地震影響丸氛,放射性物質(zhì)發(fā)生泄漏培愁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一缓窜、第九天 我趴在偏房一處隱蔽的房頂上張望定续。 院中可真熱鬧谍咆,春花似錦、人聲如沸香罐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庇茫。三九已至港粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旦签,已是汗流浹背查坪。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宁炫,地道東北人偿曙。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像羔巢,于是被迫代替她去往敵國(guó)和親望忆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • 前言 人生苦多竿秆,快來 Kotlin 启摄,快速學(xué)習(xí)Kotlin! 什么是Kotlin幽钢? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,218評(píng)論 9 118
  • 集合是開發(fā)中非常常用的知識(shí)歉备,比如操作各種數(shù)據(jù)集,各種算法匪燕,保存網(wǎng)絡(luò)請(qǐng)求結(jié)果蕾羊,作為Adapter數(shù)據(jù)集,如果你不會(huì)集...
    Knight_Davion閱讀 16,151評(píng)論 1 22
  • 數(shù)組和集合 Kotlin為數(shù)組增加了一個(gè)Array類帽驯,因此可以用面向?qū)ο蟮恼Z法使用數(shù)組龟再。 Kotlin自己提供一套...
    JamFF閱讀 1,233評(píng)論 0 2
  • Google在今年的IO大會(huì)上宣布,將Android開發(fā)的官方語言更換為Kotlin尼变,作為跟著Google玩兒An...
    藍(lán)灰_q閱讀 76,934評(píng)論 31 489
  • 哇塞 下班時(shí)間到 饑腸轆轆去食堂 排隊(duì)打飯又見大哥萌萌的笑臉 “我只要一兩米飯” “這些挺少的”吸申,大哥端著二兩的米...
    羊小艾閱讀 143評(píng)論 0 1