原创
  • 2020-07-29
  • 浏览 (2)
  • 评论 (0)

Kotlin 数组和集合

数组

Kotlin 中的数组是一个拥有泛型的类,创建函数也是泛型函数,和集合数据类型一样。

/*声明一个整形数组*/
var ints: Array<Int> = arrayOf(1, 2, 3)

/*声明一个字符串数组*/
var strs: Array<String> = arrayOf("a", "b", "c")

由于泛型化,对数组的操作可以像集合一样功能更强大,Kotlin 可以给数组增加很多有用的工具函数:

  • get() / set()
  • contains()
  • first()
  • find()

Kotlin 中获取或者设置数组元素和 Java 一样,可以使用方括号加下标的方式索引:

fun print(){
    println(strs[0])
    strs[1] = "A"
}

Kotlin 的数组编译成字节码时使用的仍然是 Java 的数组,但在语言层面是泛型实现,这样会失去协变 (covariance) 特性,就是子类数组对象不能赋值给父类的数组变量:

var strs: Array<String> = arrayOf("a", "b", "c")

var anys: Array<Any> = strs // compile-error: Type mismatch

集合

Kotlin 和 Java 一样有三种集合类型:List、Set 和 Map,它们的含义分别如下:

  1. List 以固定顺序存储一组元素,元素可以重复。
  2. Set 存储一组互不相等的元素,通常没有固定顺序。
  3. Map 存储 键-值 对的数据集合,键互不相等,但不同的键可以对应相同的值。

List

Kotlin 中创建一个列表:

var strList = listOf<String>("a", "b", "c")

首先能看到的是 Kotlin 中创建一个 List 特别的简单,有点像创建数组的代码。而且 Kotlin 中的 List 多了一个特性:支持 covariant(协变)。也就是说,可以把子类的 List 赋值给父类的 List 变量,而这在 Java 中是会报错的。对于协变的支持与否,List 和数组刚好反过来了。

//List
var strList = listOf<String>("a", "b", "c")

var anys: List<Any> = strList //success

Set

Kotlin 中创建一个 Set:

var strSet = setOf("a", "b", "c")

var anysSet: Set<Any> = strSet // success

和 List 类似,Set 同样具有 covariant(协变)特性。

Map

Kotlin 中创建一个 Map:

var map = mapOf("key1" to 1, "key2" to 2, "key3" to 3)

和上面两种集合类型相似创建代码很简洁。mapOf 的每个参数表示一个键值对,to 表示将「键」和「值」关联,这个叫做「中缀表达式」

Kotlin 中的 Map 除了和 Java 一样可以使用 get() 根据键获取对应的值,还可以使用方括号的方式获取:

var map = mapOf("key1" to 1, "key2" to 2, "key3" to 3)

val value1 = map.get("key1")
val value2 = map["key2"]

类似的,Kotlin 中也可以用方括号的方式改变 Map 中键对应的值:

var mtMap = mutableMapOf("key1" to 1, "key2" to 2)

mtMap.put("key1", 2)
mtMap["key1"] = 2

可变不可变集合

上面修改 Map 值的例子中,创建函数用的是 mutableMapOf() 而不是 mapOf(),因为只有 mutableMapOf() 创建的 Map 才可以修改。Kotlin 中集合分为两种类型:只读的和可变的。这里的只读有两层意思:

  1. 集合的 size 不可变
  2. 集合中的元素值不可变

以下是三种集合类型创建不可变和可变实例的例子:

  1. listOf() 创建不可变的 List,mutableListOf() 创建可变的 List。
  2. setOf() 创建不可变的 Set,mutableSetOf() 创建可变的 Set。
  3. mapOf() 创建不可变的 Map,mutableMapOf() 创建可变的 Map。

可以看到,有 mutable 前缀的函数创建的是可变的集合,没有 mutbale 前缀的创建的是不可变的集合,不过不可变的可以通过 toMutable*() 系函数转换成可变的集合:

var strList = listOf("a", "b", "c")

var mtStrList = strList.toMutableList()

var strSet = setOf("a", "b", "c")

var mtStrSet = mtStrList.toMutableSet()

var map = mapOf("key1" to 1, "key2" to 2, "key3" to 3)

var mtMap = map.toMutableMap()

然后就可以对集合进行修改了,这里有一点需要注意下:

toMutable*() 返回的是一个新建的集合,原有的集合还是不可变的,所以只能对函数返回的集合修改。

Sequence

除了集合 Kotlin 还引入了一个新的容器类型 Sequence,它和 Iterable 一样用来遍历一组数据并可以对每个元素进行特定的处理,先来看看如何创建一个 Sequence。

类似 listOf() ,使用一组元素创建:

var seq = sequenceOf("a", "b", "c")

使用 Iterable 创建:

var sList = listOf("a", "b", "c")
var seqList = sList.asSequence()

使用 lambda 表达式创建:

var lambdaSeq = generateSequence(0) { it + 1 }
正文到此结束
本文目录