ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 区间、数组、集合之间转换 在Kotlin中区间、数组、集合都是描述一系列元素的集合。通过上面的学习,我们看到它们有不同的地方,也有相似的地方。其实只要把其中一个的学习思路把握了。学习其他依葫芦画瓢的事情。 实际上,区间、数组、集合之间还可以相互转换。 ### Range转Array、List、Set 区间可以转数组,也可以转List和Set集合。转数组通过arrayOf方法,转List通过toList方法,转Set通过toSet方法。 arrayOf方法,可以接收区间参数,返回数组,参考签名: ```java public inline fun <reified @PureReifiable T> arrayOf(vararg elements: T): Array<T> ``` toList方法,转换为List,参考签名: ```java public fun <T> Iterable<T>.toList(): List<T> { } ``` toSet方法,返回Set,参考签名: ```java public fun <T> Iterable<T>.toSet(): Set<T> { } ``` 我们通过一个案例来验证下,参考代码: ~~~ fun main(args: Array<String>) { val intRange = 1..10 //Range->Array val arr = arrayOf(intRange) println(arr) //Range->List val list = intRange.toList() println("转换后的list集合:$list") //Range->Set val set = intRange.toSet() println("转换后的set集合:$set") } ~~~ 运行结果 ``` [Lkotlin.ranges.IntRange;@4d7e1886 转换后的list集合:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 转换后的set集合:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] Process finished with exit code 0 ``` ### Array转List、Set 数组可以转List和Set集合。转List通过toList方法,转Set通过toSet方法。 toList方法,转换为List,参考签名: ```java public fun <T> Iterable<T>.toList(): List<T> { } ``` toSet方法,返回Set,参考签名: ```java public fun <T> Iterable<T>.toSet(): Set<T> { } ``` 我们通过一个案例来验证下,参考代码: ~~~ fun main(args: Array<String>) { val array = arrayOf(1, 2, 3, 4) val newList = array.toList() println(newList) val newSet = array.toSet() println(newSet) } ~~~ 运行结果 ``` [1, 2, 3, 4] [1, 2, 3, 4] Process finished with exit code 0 ``` ### List转Array和Set List可以转Array和Set集合。转Array通过toIntArray和toTypedArray,转Set通过toSet方法。 toIntArray方法,转换为Int数组,方法签名: ```java public fun Collection<Int>.toIntArray(): IntArray { } ``` toTypedArray方法,根据List中包含元素的类型转换为对应的集合,如果是List<String>转换为String数组,如果是List<Int>转换为Int数组,方法签名: ![](http://upload-images.jianshu.io/upload_images/7368752-a6dbd9178574feba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 这里用到了关键字**reified**,这个是在泛型里面会接受的知识点。 toSet方法,返回Set,参考签名: ```java public fun <T> Iterable<T>.toSet(): Set<T> { } ``` 我们通过一个案例来验证下,参考代码: ~~~ fun main(args: Array<String>) { val list = listOf(1,2,3,4,5) val intArray = list.toIntArray() println(intArray.toList()) val newArray = list.toTypedArray() println(newArray.toList()) val newSet2 = list.toSet() println(newSet2) } ~~~ 运行结果 ``` [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Process finished with exit code 0 ``` ### Set转Array和List Set可以转Array和List集合。转Array通过toIntArray和toTypedArray,转List通过toList方法。 toIntArray方法,转换为Int数组,方法签名: ```java public fun Collection<Int>.toIntArray(): IntArray {  } ``` toTypedArray方法,根据List中包含元素的类型转换为对应的集合,如果是List<String>转换为String数组,如果是List<Int>转换为Int数组,方法签名: ![](http://upload-images.jianshu.io/upload_images/7368752-8af381cc95d3cdcd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 这里用到了关键字**reified**,这个是在泛型里面会接受的知识点。 toSet方法,返回Set,参考签名: ```java public fun <T> Iterable<T>.toSet(): Set<T> { } ``` 我们通过一个案例来验证下,参考代码: ~~~ fun main(args: Array<String>) { val set = setOf(1, 2, 3, 4, 5) val intArray = set.toIntArray() println(intArray.toList()) val array = set.toTypedArray() println(array.toList()) val list = set.toList() println(list) } ~~~ 运行结果 ``` [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] Process finished with exit code 0 ``` ### Map转Array、List和Set Map可以直接转List集合,那么List中所转元素的类型就是Pair。Map想要转Array、List和Set只能先获取map的keys或者values进行换行。所用的方法还是之前提到的toList、toSet、toTypedArray,所以这里就不做过多解释了,直接演示下例子: ~~~ fun main(args: Array<String>) { val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3) val values = map.values val keys = map.keys val array = values.toTypedArray() println(array.toList()) val list = values.toList() println(list) val set = values.toSet() println(set) val arr = keys.toTypedArray() println(arr.toList()) val newList = keys.toList() println(newList) val newSet = keys.toSet() println(newSet) println("---------key 和 values 转换为其他---------") val list1 = map.toList() for (pair in list1) { println("${pair.first}->${pair.second}") } } ~~~ 运行结果 ``` [1, 2, 3] [1, 2, 3] [1, 2, 3] [a, b, c] [a, b, c] [a, b, c] ---------key 和 values 转换为其他--------- a->1 b->2 c->3 Process finished with exit code 0 ```