【KtAndroid - 5】kotlin的集合框架

首先,我說一下,很多人大概都還在猶豫要不要學(xué)kotlin。

其實我也猶豫過,但是,我還是學(xué)了,正在學(xué)。

我來說一下我的看法。

對于一門編程語言的興起,我們無法阻止,更不能阻止。

為什么呢?因為這代表了時代的進(jìn)步,如果連時代的腳步都不跟上而是選擇逃避或者觀望,那么注定會被時代淘汰。

都2020了,我還在網(wǎng)上看見各種人,各種借口各種逃避。

沒有用的,逃避解決不了任何問題。既然解決不了問題,那么就不能面對問題么?

多掌握一門技術(shù)總不是壞事。

很多人都說,媽耶,又出新的技術(shù),學(xué)不動了。

呵呵,我想說,你學(xué)過么?認(rèn)真學(xué)過么?

還是那句話:對于一門編程語言的興起,我們無法阻止,更不能阻止。

人類所具備的最偉大的一個特點就是能學(xué)習(xí),會學(xué)習(xí)。

不要讓逃避成為借口,因為那會使你逐漸墮落、消亡。

1. List與MutableList

在java中,集合框架非常重要,幾乎每個程序中都會用到。

然而在kotlin中,同樣也提供了集合框架。

我們都知道,在java中有一個List<T>集合。同樣,在kotlin中也有List<T>集合

但是兩者是有區(qū)別的。

在java中List<T>屬于可變長度集合,也就是可以不停的addremove

然而在kotlinList<T>是屬于不可變長的集合。

看個例子:

1.png

可以看到。

  1. 我們首先listof()了一個list0:List<Int>
  2. 然后使用list0.查看了它支持的所有方法,白色加粗的方法是它自身方法。

發(fā)現(xiàn)有[]數(shù)組的取值法,get()的取值法,還有一系列其他方法。

但是獨獨沒有add(),remove()方法。

那么,就有人會問了,如果我需要的可變長的List怎辦呢?

來唄,接下來我們就來說說 MutableList

中文意思不就是 可變的列表 么。

看圖:

2.png

是不是出來了?

這就kotlin中可變列表 MutableList 與定長列表 List 的介紹了。

但是??!

為什么會有這兩個可變概念呢?

2. List與MutableList在java中的定義(CollectionsKt)

之前也說過,kotlin是調(diào)用的jvm,所有的kotlin代碼編譯后,將會轉(zhuǎn)換成class可執(zhí)行文件。

那么我們就來看看在java中List與MutableList的概念了。

kotlin to java:

3.png

從上圖我們可以看到,在java代碼中兩個變量list0,list1 都是List類型。

但是從調(diào)用的方式來看,一個是調(diào)用CollectionsKt下的listOf,另一個則是調(diào)用的mutableListOf

那么這兩個有什么區(qū)別呢?

也就是可變和不可變的區(qū)別了。

我首先把這部分的兩個java list0List1 說開。

首先,java中的List<T>從來沒有禁用過add和remove吧。

4.png

不論是ArrayListLinkedList都有add和remove方法。那么由此是不是可以推倒出add和remove是由kotlin所控制的?

來,那就看看kotlin中的ListMutableList

按住 ctrl+鼠標(biāo)左鍵 點擊指定方法,進(jìn)入源碼。

List

5.png

MutableList

6.png

瞧,剛打開就一目了然。

講完了?!好吧……

3. Map 與 MutableMap

接下來就說MapMutableMap了,與List一樣,兩者都是java中的Map衍生出來的,就主要說說用法。

7.png

與java不同的是,java所用是map.put(key,value) ,kotlin中則是 key to value 注意to前后的空格哦。

一. Pair

另外就是Pair

val pair = "key" to "vlaue"
val pair1 = Pair("key11", "value11")

其實二者并沒有什么不同,前者就相當(dāng)于一個隱式的Pair了,同時Pair還定義了一個first和一個second,可以取key和value的值。

二. Triple

這是一個很新的類了,相較于Pair Triple 就是多了一個成員

14.png

4. Set 與 MutableSet

8.png

5. 可變長框架的 增、刪、查、改

在java中想要對List進(jìn)行增刪查改只需要add,remove,get,replace

然而在kotlin中還有一種方式

list1.add("add1")
list1 += "add2"

運行結(jié)果:

11.png
list1.remove("add1")
list1 -= "add2"

運行結(jié)果:

12.png

類似數(shù)組的操作方式:

val v = list1[0]
list1[1] = "1000"
println(v)
println(list1)

val v1 = map1["key11"]
map1["key11"] = "我愛你"
println(v1)
println(map1)
13.png

6. typealias

接下來要說的就是typealias了,字面意思理解就是類型別名

那么什么是類型別名呢?

dart中有typeof,c++里有命名空間

9.png

首先,我們創(chuàng)建一個ArrayList(這東西在java中可是及其常見的啊)

打開源碼:

10.png

瞧,一系列的public actual typealias 分別賦值就是java.util.*

那么是不是顯而易見了,就是給java中相應(yīng)的類取了一個別名,好讓它能在kotlin中使用。

7. actual與expect

既然碰到了actual那我就提一下吧。

根據(jù) http://www.itdecent.cn/p/c22ae432827a 這篇文章。

我們可以知道:

expect 定義了一個跨平臺(jvm)接口

actual則表示了該接口在kotlin中的實現(xiàn)

8. 總結(jié)

  1. kotlin中,List,MapSet表示定長的集合,不能進(jìn)行addremove等一系列增刪改
  2. kotlin中,MutableListMutableMap,MutableSet與java中的ListMap,Set無異
  3. kotlin中,typealias 關(guān)鍵字表示定義別名,通俗來說就是取外號。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容