首先,我說一下,很多人大概都還在猶豫要不要學(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>屬于可變長度集合,也就是可以不停的add,remove
然而在kotlin中List<T>是屬于不可變長的集合。
看個例子:

可以看到。
- 我們首先
listof()了一個list0:List<Int> - 然后使用
list0.查看了它支持的所有方法,白色加粗的方法是它自身方法。
發(fā)現(xiàn)有[]數(shù)組的取值法,get()的取值法,還有一系列其他方法。
但是獨獨沒有add(),remove()方法。
那么,就有人會問了,如果我需要的可變長的List怎辦呢?
來唄,接下來我們就來說說 MutableList 吧
中文意思不就是 可變的列表 么。
看圖:

是不是出來了?
這就kotlin中可變列表 MutableList 與定長列表 List 的介紹了。
但是??!
為什么會有這兩個可變概念呢?
2. List與MutableList在java中的定義(CollectionsKt)
之前也說過,kotlin是調(diào)用的jvm,所有的kotlin代碼編譯后,將會轉(zhuǎn)換成class可執(zhí)行文件。
那么我們就來看看在java中List與MutableList的概念了。
kotlin to java:

從上圖我們可以看到,在java代碼中兩個變量list0,list1 都是List類型。
但是從調(diào)用的方式來看,一個是調(diào)用CollectionsKt下的listOf,另一個則是調(diào)用的mutableListOf
那么這兩個有什么區(qū)別呢?
也就是可變和不可變的區(qū)別了。
我首先把這部分的兩個java list0,List1 說開。
首先,java中的List<T>從來沒有禁用過add和remove吧。

不論是ArrayList和LinkedList都有add和remove方法。那么由此是不是可以推倒出add和remove是由kotlin所控制的?
來,那就看看kotlin中的List與MutableList
按住 ctrl+鼠標(biāo)左鍵 點擊指定方法,進(jìn)入源碼。
List

MutableList

瞧,剛打開就一目了然。
講完了?!好吧……
3. Map 與 MutableMap
接下來就說Map與MutableMap了,與List一樣,兩者都是java中的Map衍生出來的,就主要說說用法。

與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 就是多了一個成員

4. Set 與 MutableSet

5. 可變長框架的 增、刪、查、改
在java中想要對List進(jìn)行增刪查改只需要add,remove,get,replace
然而在kotlin中還有一種方式
list1.add("add1")
list1 += "add2"
運行結(jié)果:

list1.remove("add1")
list1 -= "add2"
運行結(jié)果:

類似數(shù)組的操作方式:
val v = list1[0]
list1[1] = "1000"
println(v)
println(list1)
val v1 = map1["key11"]
map1["key11"] = "我愛你"
println(v1)
println(map1)

6. typealias
接下來要說的就是typealias了,字面意思理解就是類型別名
那么什么是類型別名呢?
dart中有typeof,c++里有命名空間

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

瞧,一系列的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é)
- kotlin中,
List,Map,Set表示定長的集合,不能進(jìn)行add和remove等一系列增刪改 - kotlin中,
MutableList,MutableMap,MutableSet與java中的List,Map,Set無異 - kotlin中,
typealias關(guān)鍵字表示定義別名,通俗來說就是取外號。