例1: 声明并初始化
val set1 = setOf(1,2,"3","4","2",1,2,3,4,5) val mutableSet1 = mutableSetOf(1,2,"3","4","2",1,2,3,4,5) val mutableSet2 : HashSet<String> // 这里的HashSet<>和Java里面的HashSet<>一致例2 :遍历集合,看效果与预计的有什么不同
// 遍历 for(value in set1){ print("$value \t") }输出结果:
1 2 3 4 2 3 4 5在我们预计的效果中,遍历的结果应该为:1 2 3 4 2 1 2 3 4 5,但是结果却少了一个1 2。那么我们可以看出,Set类型集合会把重复的元素去除掉。这一点和Java是不谋而合的。这个特性也是Set类型集合与List集合类型的区别所在。
2.3、Map类型Map<K,V>类型集合和List以及Set都有着差别。下面我们看Map类型集合的声明及初始化。
同前面两种类型一样,Map同样也分为不可变与可变集合。其中:
不可变的Map类型集合的初始化使用:mapOf()函数
可变的Map类型集合的初始化使用:mutableMapOf()函数
不过初始化和前面两种类型有差别,Map集合类型是一种以键-值对的方式出现。例:
// 以键值对的形式出现,键与值之间使用to val map1 = mapOf("key1" to 2 , "key2" to 3) val map2 = mapOf<Int,String>(1 to "value1" , 2 to "value2") val mutableMap = mutableMapOf("key1" to 2 , "key1" to 3) val hashMap = hashMapOf("key1" to 2 , "key1" to 3) // 同Java中的HashMap map2.forEach{ key,value -> println("$key \t $value") }输出结果为:
1 value1 2 value2注意:当我们的键存在重复时,集合会过滤掉之前重复的元素。
例:
val map = val map1 = mapOf("key1" to 2 , "key1" to 3 , "key1" to "value1" , "key2" to "value2") map.forEach{ key,value -> println("$key \t $value") }输出结果为:
key1 value1 key2 value2从上面的例子可以看出,当key值为key1时,元素只保留了最后一个元素。而过滤掉了之前key值相同的所有元素。
三、 集合类型的协变试想一下,当一个集合赋值给另外一个集合时,这里以List<E>举例,如果两个集合的类型也就是E类型相同时,赋值是没有问题的。如果类型不同的情况,当E继承自M时。你就可以把List<E>赋值给List<M>了。这种情况称之为协变
我这里举两个例子
例1:
open class Person(val name : String , val age : Int){ override fun toString(): String { return "Person(name='$name', age=$age)" } } class Student(name: String, age : Int, cls : String) : Person(name, age) // 注意:Any是kotlin中的超类,故而Student类也是继承自Any的。这里你可以换成Person类结果是相同的 var listPerson: List<Any> val listStudent : List<Student> = listOf(Student("张三",12,"一班"),Student("王五",20,"二班")) listPerson = listStudent listPerson.forEach { println(it.toString()) }输出结果:
Person(name='张三', age=12) Person(name='王五', age=20)例2:当集合的类型相同或有继承关系时,一个集合使用MutableList,一个集合使用List的情况。
var mutableListPerson: MutableList<Person> val mutableListStudent : List<Student> = listOf(Student("张三",12,"一班"),Student("王五",20,"二班")) mutableListPerson = mutableListStudent.toMutableList() mutableListPerson.add(Person("a",15)) mutableListPerson.add(Person("b",45)) mutableListPerson.forEach { println(it.toString()) }输出结果为:
Person(name='张三', age=12) Person(name='王五', age=20) Person(name='a', age=15) Person(name='b', age=45)看上面的实例2,使用了一个toMutableList()函数,其实这个函数的意思是把List转换成了MutableList。在以下的源码中我们可以看出:其实是实例化了一个ArrayList。
public fun <T> Collection<T>.toMutableList(): MutableList<T> { return ArrayList(this) } public fun <T> Iterable<T>.toMutableList(): MutableList<T> { if (this is Collection<T>) return this.toMutableList() return toCollection(ArrayList<T>()) }Set、Map集合的协变和上面的代码都相差不多,调用不同的转换函数罢了。除了toMutableList()函数以外,还有着toList()、toHashSet()、toSet()等等函数。这些函数都是在Iterable接口的拓展函数。大家有兴趣可以自己去看看源码,这里不做详细的累述。
四、一些常用的处理集合类型的拓展函数除了上面讲到的toList()、toSet()、toHastSet()、toMutableList()、toSet()、toIntArray()等等拓展函数之外。还有一些常用的拓展的高阶函数。这里列举几个说明。并实例分析他们的作用。所有的源码都在kotlin\collections\_Collections.kt文件。
不过这里由于文章篇幅的原因:这一节的内容会在下一章文章讲解。
请参见Kotlin——高级篇(五):集合之常用操作符总结
总结