Kotlin 转换

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集合。在这个新集合中去这个判断原集合的类型是不是返回集合的类型,如果是,则获取原集合的第一个元素作为新集合的元素返回。反之,则遍历原集合的元素。当原集合个数不为01时,使用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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值