1.转换为数组
当我们声明一个集合,可以把这个集合根据调用集合类相应的高阶函数来转换成相应的数组。集合类提供了
toIntArray()
、toDoubleArray()
、toFloatArray()
、toBetArray()
等高阶函数去处理。下面提供一个函数的源码,其他函数的源码处理逻辑是相同的,有兴趣的朋友可以去看看这个源码类。
源码:
public fun Collection<Int>.toIntArray(): IntArray {
val result = IntArray(size)
var index = 0
for (element in this)
result[index++] = element
return result
}
解释:从上面的源码,我们可以看出,该函数的返回类型时IntArray
类型,即表示一个Int
类型的数组。该函数的逻辑是定义一个Int
类型的数组,然后遍历集合,把集合的元素一个一个的添加到定义的数组当中。
实例:
fun listToArray(){
val list = listOf<Int>(1,2,3,4,5,6) // 声明一个Int类型的List
val listArray = list.toIntArray() // 转换
println(list.javaClass.toString()) // 打印list的类型
println(listArray.javaClass.toString()) // 打印listArray的类型
println(listArray[1])
}
输出结果:
变量list的类型为:class java.util.LinkedHashSet
变量listArray的类型为:class [I
2
1.2、转换为集合
我们知道在
Kotlin
中,集合可分为不可变集合与可变集合。我们声明一个集合或者数组,可以转换成相应类型的集合。调用toXXX()
转换成不可变集合。调用toMutableXXX()
转换为可变集合。集合类提供了toList()
、toMutableList()
、toSet()
、toMutableSet()
、toHashSet()
、toMap()
等高阶函数去处理。同理也是从源码的角度去分析。
源码:这个是集合转集合的源码。数组转集合的源码还要简单些。
public fun <T> Iterable<T>.toList(): List<T> {
if (this is Collection) {
return when (size) {
0 -> emptyList()
1 -> listOf(if (this is List) get(0) else iterator().next())
else -> this.toMutableList()
}
}
return this.toMutableList().optimizeReadOnlyList()
}
解释:首先判断是不是一个集合,如果是一个集合的情况,则根据集合的元素个数来执行相应的逻辑,当元素的个数为0
时,返回一个空集合。当为1
个的时候,用listOf()
去初始化一个List
集合。在这个新集合中去这个判断原集合的类型是不是返回集合的类型,如果是,则获取原集合的第一个元素作为新集合的元素返回。反之,则遍历原集合的元素。当原集合个数不为0
或1
时,使用toMutableList()
转换成list。如果不是集合,则直接使用toMutableList()
转换。这里的optimizeReadOnlyList()
函数的逻辑即是上面原集合的逻辑。
解释起来很复杂,还是用代码说话吧...
实例:
// 数组转集合
fun arrayToList() {
val arr = arrayOf(1,3,5,7,9)
val list = arr.toList()
println("变量arr的类型为:${arr.javaClass}")
println("变量list的类型为:${list.javaClass}")
println(list[1])
}
// 集合转集合,这里用Set转List
fun listToList(){
val set = setOf(1)
val setTolist = set.toList()
println("变量set的类型为:${set.javaClass}")
println("变量setTolist的类型为:${setTolist.javaClass}")
println(setTolist[0])
}
输出结果为:
变量arr的类型为:class [Ljava.lang.Integer;
变量list的类型为:class java.util.ArrayList
3
变量set的类型为:class java.util.Collections$SingletonSet
变量setTolist的类型为:class java.util.Collections$SingletonList
1