14.集合
创建一个包含水果名称的集合,可类似java的写法,ef:
val list = ArrayList<String>()
list.add("Apple")
list.add("Banana")
list.add("Orange")
但以上这种写法有点繁琐,kt提供了一种内置函数listOf()简化,其中listOf()是不可变的只在创建时赋值,只可读取即不可进行增删改操作,kt这样设计的理由:类似val、类默认不可继承的初衷类似,ef:
val list = listOf("Apple", "Banana", "Orange")
若想创建个可变的集合则可以用到mutableListOf,mutableListOf可存放相同元素,ef:
fun main(){
val list = mutableListOf("Apple", "Banana", "Orange")
list.add("Pear")
list.add("Apple")
for(fruit in list){
println(fruit)
}
}
//打印结果为:
Apple
Banana
Orange
Pear
Apple
去重的可变集合为setOf(),该集合若存放了多个不同的元素,只保留一个,ef:
fun main(){
val set = setOf("Apple", "Banana", "Orange", "Pear", "Apple")
for(fruit in set){
println(fruit)
}
}
//打印如下,最后添加的Apple不放入集合中,起到了去重的效果
Apple
Banana
Orange
Pear
键值对的集合Map,和java的类似,下面来创建一个带编号的水果集,并通过键值获取,ef:
fun main(){
val map = HashMap<String, Int>()
map.put("Apple", 1)
map.put("Banana", 2)
map.put("Orange", 3)
map.put("Pear", 4)
println(map.get("Apple"))
}
//打印如下
1
但其实kt中不建议使用类似java的方式put()和get()操作添加和读取map,而采用类似数组下标的语法结构,ef:
val map = HashMap<String, Int>()
//添加键值
map["Apple"] = 1
map["Banana"] = 2
map["Pear"] = 3
//通过键读取值
val number = map["Apple"]
但这仍不是最简写法,可通过mapOf()和mutableMapOf()继续简化,用infix函数to将键值关联,infix函数会在后面补上;其中mapOf()是不可变的,只在创建时赋值,只读不可操作;而mutableMapOf()为可变,可操作的,ef:
fun main(){
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3)
//以下遍历集合
for((fruit, number) in map){
println("fruit is " + fruit + ", number is " + number)
}
}
//mutableMapOf()类似,不过多了增删改的操作,这里暂不做详讲
//上面的maoOf()打印如下
fruit is Apple, number is 1
fruit is Banana, number is 2
fruit is Orange, number is 3
下面归纳一下:
集合 | listOf() | mutableListOf() | setOf() | mapOf() | mutableMapOf() |
作用差异 | 不可变、元素可重复 | 可变、元素可重复 | 可变、元素去重 | 不可变键值对 | 可变键值对 |