Kotlin集合分为可变集合和不可变集合,不可变的集合指的就是该集合只能用于读取,无法进行添加、修改或删除操作。
1、不可变集合
val fruits = listOf<String>("apple","orange","pear")
使用for-in
遍历该集合
val fruits = listOf<String>("apple","orange","pear")
for (fruit in fruits) {
println(fruit)
}
2、可变集合
fun main() {
val fruits = mutableListOf("apple", "orange", "pear")
fruits.add("kiwi")
for (fruit in fruits) {
println(fruit)
}
}
1、不可变集合
val fruits = mapOf("apple" to 2.5, "orange" to 5, "pear" to 3)
这里key
值和value
是通过to
进行连接,但是to
并不是关键字,而是一个infix
函数。
使用for-in
遍历该集合:
val fruits = mapOf("apple" to 2.5, "orange" to 5, "pear" to 3)
for ((key, value) in fruits){
println("$key's price is $value")
}
2、可变集合
fun main() {
var fruits = mutableMapOf("apple" to 2.5, "orange" to 5, "pear" to 3)
fruits.put("kiwi",6)
for ((key, value) in fruits){
println("$key's price is $value")
}
}
API - maxByOrNull
这里有个需求找到上面列表中水果名字最长的水果:
fun main() {
val fruits = listOf<String>("apple", "orange", "pear", "watermelon")
val maxLengthFruit = fruits.maxByOrNull { it.length }
println(maxLengthFruit)
}
//运行结果:watermelon
这里用到的maxByOrNull
就是集合的函数式API,作用是根据大括号中Lambda表达式筛选出符合条件最大的。
1、Lambda表达式使用
Lambda语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
maxByOrNull
函数需要一个Lambda表达式,最初的写法如下:
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = fruits.maxByOrNull(lambda )
2、Lambda表达式简化写法
在很多情况下,我们并不需要使用Lambda 表达式完整的语法结构,而是有很多种简化的写法。
1)直接把Lambda表达式传入到函数中,不在单独声明:
val maxLengthFruit = fruits.maxByOrNull({ fruit: String -> fruit.length })
2)当Lambda 参数是函数的最后一个参数时,可以将Lambda 表达式移到函数括号的外面:
val maxLengthFruit = fruits.maxByOrNull(){ fruit: String -> fruit.length }
3)如果Lambda 参数是函数的唯一一个参数的话,还可以将函数的括号省略
val maxLengthFruit = fruits.maxByOrNull{ fruit: String -> fruit.length }
4)因为Kotlin拥有出色的类型推导机制,所以入参类型可以去掉:
val maxLengthFruit = fruits.maxByOrNull{ fruit -> fruit.length }
5)当Lambda 表达式的参数列表中只有一个参数时,也不必声明参数名,而是可以使用it
关键字来代替:
val maxLengthFruit = fruits.maxByOrNull { it.length }
经过上面一系列的变化最后得到了刚开始写的语句。
3、练习:模仿上面例子可以写一个筛选出水果中价格最大的水果:
fun main() {
var fruitsMap = mutableMapOf("apple" to 2.5, "orange" to 5, "pear" to 3)
val maxPriceFruit = fruitsMap.maxByOrNull { it.value.toFloat() }
println(maxPriceFruit?.key)
}
//运行结果:orange
API - map
API map
将集合中的每个元素都映射成一个另外的值,映射的规则在Lambda 表达式中指定,最终生成一个新的集合。
fun main() {
val fruits = listOf<String>("apple", "orange", "pear", "watermelon")
val newFruitList = fruits.map { it.uppercase() }
println(newFruitList)
}
//[APPLE, ORANGE, PEAR, WATERMELON]
API - filter
filter
函数是用来过滤集合中的数据的,它可以单独使用,也可以配合map
函数一起使用。
需求:将水果名字长度大于5的水果转为大写
fun main() {
val fruits = listOf<String>("apple", "orange", "pear", "watermelon")
val newFruitList = fruits.filter { it.length > 5 }.map { it.uppercase() }
println(newFruitList)
}
//[ORANGE, WATERMELON]
API - any
和all
any
函数用于判断集合中是否至少存在一个元素满足指定条件,all
函数用于判断集合中是否所有元素都满足指定条件。
fun main() {
val fruits = listOf<String>("apple", "orange", "pear", "watermelon")
val anyResult = fruits.any { it.length > 5 }
val allResult = fruits.all { it.length > 5 }
println("anyResult: $anyResult | allResult: $allResult")
}
//anyResult: true | allResult: false
本文参考书籍:《第一行代码》- 郭霖