美文网首页
【KtAndroid - 5】kotlin的集合框架

【KtAndroid - 5】kotlin的集合框架

作者: 会飞的小魚 | 来源:发表于2020-04-28 22:09 被阅读0次

首先,我说一下,很多人大概都还在犹豫要不要学kotlin。

其实我也犹豫过,但是,我还是学了,正在学。

我来说一下我的看法。

对于一门编程语言的兴起,我们无法阻止,更不能阻止。

为什么呢?因为这代表了时代的进步,如果连时代的脚步都不跟上而是选择逃避或者观望,那么注定会被时代淘汰。

都2020了,我还在网上看见各种人,各种借口各种逃避。

没有用的,逃避解决不了任何问题。既然解决不了问题,那么就不能面对问题么?

多掌握一门技术总不是坏事。

很多人都说,妈耶,又出新的技术,学不动了。

呵呵,我想说,你学过么?认真学过么?

还是那句话:对于一门编程语言的兴起,我们无法阻止,更不能阻止。

人类所具备的最伟大的一个特点就是能学习,会学习。

不要让逃避成为借口,因为那会使你逐渐堕落、消亡。

1. List与MutableList

在java中,集合框架非常重要,几乎每个程序中都会用到。

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

我们都知道,在java中有一个List<T>集合。同样,在kotlin中也有List<T>集合

但是两者是有区别的。

在java中List<T>属于可变长度集合,也就是可以不停的addremove

然而在kotlinList<T>是属于不可变长的集合。

看个例子:

1.png

可以看到。

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

发现有[]数组的取值法,get()的取值法,还有一系列其他方法。

但是独独没有add(),remove()方法。

那么,就有人会问了,如果我需要的可变长的List怎办呢?

来呗,接下来我们就来说说 MutableList

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

看图:

2.png

是不是出来了?

这就kotlin中可变列表 MutableList 与定长列表 List 的介绍了。

但是!!

为什么会有这两个可变概念呢?

2. List与MutableList在java中的定义(CollectionsKt)

之前也说过,kotlin是调用的jvm,所有的kotlin代码编译后,将会转换成class可执行文件。

那么我们就来看看在java中List与MutableList的概念了。

kotlin to java:

3.png

从上图我们可以看到,在java代码中两个变量list0list1 都是List类型。

但是从调用的方式来看,一个是调用CollectionsKt下的listOf,另一个则是调用的mutableListOf

那么这两个有什么区别呢?

也就是可变和不可变的区别了。

我首先把这部分的两个java list0List1 说开。

首先,java中的List<T>从来没有禁用过add和remove吧。

4.png

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

来,那就看看kotlin中的ListMutableList

按住 ctrl+鼠标左键 点击指定方法,进入源码。

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

其实二者并没有什么不同,前者就相当于一个隐式的Pair了,同时Pair还定义了一个first和一个second,可以取key和value的值。

二. Triple

这是一个很新的类了,相较于Pair Triple 就是多了一个成员

14.png

4. Set 与 MutableSet

8.png

5. 可变长框架的 增、删、查、改

在java中想要对List进行增删查改只需要add,remove,get,replace

然而在kotlin中还有一种方式

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

运行结果:

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

运行结果:

12.png

类似数组的操作方式:

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

首先,我们创建一个ArrayList(这东西在java中可是及其常见的啊)

打开源码:

10.png

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

那么是不是显而易见了,就是给java中相应的类取了一个别名,好让它能在kotlin中使用。

7. actual与expect

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

根据 https://www.jianshu.com/p/c22ae432827a 这篇文章。

我们可以知道:

expect 定义了一个跨平台(jvm)接口

actual则表示了该接口在kotlin中的实现

8. 总结

  1. kotlin中,ListMapSet表示定长的集合,不能进行addremove等一系列增删改
  2. kotlin中,MutableListMutableMapMutableSet与java中的ListMapSet无异
  3. kotlin中,typealias 关键字表示定义别名,通俗来说就是取外号。

相关文章

网友评论

      本文标题:【KtAndroid - 5】kotlin的集合框架

      本文链接:https://www.haomeiwen.com/subject/nqeiwhtx.html