第二讲 集合篇
前介
Kotlin 完全兼容 java 的集合,且 Kotlin 有专有的集合:可变集合&不可变集合(本质是还是 java 的集合,后面讲到的类的映射大家就明白啦)。
不可变集合
不可变集合,集合在创建的时候,就知道元素的个数与内容。创建后不可以新增元素。
fun main() {
/**
* Kotlin 不可变集合 (纯属自淫)
* 都不带有 add 方法和 remove 方法
*
* 为何说自淫呢? 其实不可变的集合,就是给编译器看的.编译器不让你写 remove 方法,最终编译的 class 文件都映射成了 java 的集合
*/
val listOf = listOf<String>("1", "2", "3")
val setof = setOf<String>("1", "2", "3")
val map = mapOf<String, Int>(Pair("1", 1), Pair("2", 2))
/**
* 注意:
* 为啥可以用 to 连接呢?(后续讲到神奇的中缀符号,类似自定义操作符)
*/
val mapof = mapOf("1" to 1, "2" to 3)
}
补充一点:
Kotlin 的不可变集合,在定义的时候就固定了元素个数与内容。这个限定范围只在 Kotlin 语言范围中(编辑器限制)。若 java 调用 Kotlin 中的不可变集合,就会打破这个限制。(本质还是 java 的集合)
可变集合
fun main() {
/**
* Kotlin 中的可变集合
* 最终也是映射成 java 的集合
*/
val list = mutableListOf<String>("1", "2", "3")
val mutableMapOf = mutableMapOf(1 to 2, 2 to 3)
val mutableSetOf = mutableSetOf(1 , 3)
/**
* 当然 Kotlin 也可以直接使用 Java 的集合定义
*/
val javaList = ArrayList<String>()
val javaMap = HashMap<String, Int>()
val javaSet = HashSet<String>()
}
Kotlin 集合方法的封装
Kotlin 是为我们扩展了好多方便操作集合方法,我们来看看常用的几个吧。
List 集合
可直接通过索引获取
fun main() {
val javaList = ArrayList<String>()
/**
* 直接通过索引访问
*/
val s = javaList[0]
}
取区间
还记得 Kotlin 特有的区间吗?当我们想从 list 集合中取一个区间范围的时候,使用 slice 方法即可。
fun main() {
val javaList = ArrayList<String>()
/**
* 取区间,当然也可以使用半开区间 until
*/
val result = javaList.slice(0..2)
}
List集合直接相加减
Kotlin List 集合可以运算啦!!!(大伙考虑下,怎么实现的呢?)
| 操作 | 解释 |
|---|---|
| list1 + list2 | 最终结果,合并2个集合 |
| list1 - list2 | 最终结果 list1 删除,存在list2的元素 |
/**
* 2个集合相加,得到第三个集合.
* 2个集合相减,左边的集合删除右边集合中存在的元素
*/
fun main() {
/**
* 这里我特意创建了2个不同类型的集合
*/
val list = mutableListOf<String>("1", "2", "3")
val javaList = ArrayList<String>()
/**
* 发现还可以相加,充分证明了,他俩有不可拆分的联系
*/
val listAdd = list + javaList
}
遍历丶转换丶过滤
Kotlin 提供了很多类似 RxJava 的操作符。
fun main() {
val javaList = ArrayList<String>()
/**
* 数据转换
*/
javaList.map {
}
/**
* 过滤
*/
javaList.filter {
}
/**
* flatMap转换
*/
javaList.flatMap {
}
/**
* 遍历
*/
javaList.forEach {
}
/**
* 索引+值遍历
*/
javaList.forEachIndexed { index, s ->
}
}
删除元素
Kotlin 的 remove 方法是删除指定元素,removeAt 是按照索引删除,removeIf 可以条件删除。
fun main() {
val list= mutableListOf<String>()
/**
* 对象删除
*/
list.remove("")
/**
* 索引删除
*/
list.removeAt(0)
/**
* 条件删除
*/
list.removeIf {
}
}
Map集合
Map 集合在 Java 中是经常使用的集合。但是我不得不吐糟 Java 中 map 集合遍历很恶心。Kotlin 做了很大的改变,接下来脱光他的衣服。
增加元素
增加元素可以直接使用,类似数组赋值的语法增加(取 key 的值,也支持此语法)。
fun main() {
/**
* 创建可变 Map 并增加 2 个元素
* 注意: 这里的增加元素是通过 key to value 的形式,后面会讲解这个 to 的原理
*/
val mutableMapOf = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)
/**
* 新的增加元素方式,增加 key=阿花 value=12 的一个元素
*/
mutableMapOf["阿花"] = 12
}
删除元素
fun main() {
val mutableMapOf = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)
mutableMapOf.remove("阿文")
}
遍历丶转换丶过滤
fun main() {
val mutableMapOf = mutableMapOf<String, Int>("阿文" to 18, "小丽" to 18)
/**
* map 转换
*/
mutableMapOf.map {
}
/**
* 过滤
*/
mutableMapOf.filter {
}
/**
* 遍历
*/
mutableMapOf.forEach { key, value ->
}
/**
* in 遍历
*/
for (mutableEntry in mutableMapOf) {
}
/**
* 这种形式的遍历和上面的 in 遍历方式是一致的
* 为何可以这样写?后面讲到重载操作符会补充这里
*/
for ((value, key) in mutableMapOf) {
}
}
总结
Kotlin 为集合提供了很多强大的辅助方法,实现原理都很简单。(都是对集合进行封装。其实这些牛B多功能全都归功于,koltin 的扩展函数)