Kotlin学习 - 集合

List创建和遍历

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)
    }
}

Map创建和遍历

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

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 - anyall

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

本文参考书籍:《第一行代码》- 郭霖

你可能感兴趣的:(kotlin,kotlin,学习,android)