四、Lambda编程
1.集合的遍历与创建
Kotlin专门提供了一个内置的listOf()函数来简化初始化List集合的写法,示例:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
1
for-in循环遍历集合,示例:
for (fruit in list) {
println(fruit)
}
1
2
3
注意:
listOf()函数创建的是一个不可变的集合。不可变集合指的是该集合只能读取,无法进行添加、修改或删除操作。
使用mutableListOf()函数创建一个可变的集合,示例:
val list = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
list.add("Watermelon")
1
2
Set集合创建和遍历方式和List集合的类似,只是将创建集合的方式换成了setOf()和mutableSetOf()函数而已。
注意:
Set集合底层是使用hash映射机制来存放数据的,因此集合中的元素无法保证有序。
Map是一种键值对形式的数据结构,在用法上和上诉集合有较大的不同。相比于Java,Kotlin中不建议使用put()和get()方法来对Map进行添加和读取操作,而推荐使用一种类似于数字下标的语法结构,示例:
val map = HashMap<String, Int>()
//添加数据
map["Apple"] = 1
//读取数据
val number = map["apple"]
1
2
3
4
5
Kotlin也提供了一对mapOf()和mutableMapOf()函数来简化Map的用法。在mapOf()函数中,直接传入初始化的键值对组合来完成对Map集合的创建,示例:
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3)
1
注意:
上诉代码中的to不是关键字,而是一个infix函数
for-in循环遍历Map,示例:
for ((fruit, number) in map) {
println(fruit + number)
}
1
2
3
2.集合的函数式API
Lambda的定义: Lambda就是一小段可以作为参数传递的代码。
Lambda表达式的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
1
上诉代码中最外层是一对大括号,如果有参数传入到Lambda表达式中,则需要声明参数列表,参数列表结尾用一个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码,最后一行会自动作为Lambda表达式的返回值。
比如我们需要找到list中长度最长的那个单词,初始代码示例如下:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val lambda = {fruit: String -> fruit.length}
val maxLengthFruit = list.maxBy(lambda)
1
2
3
第一步化简,直接将lambda表达式传入maxBy函数中:
val maxLengthFruit = list.maxBy({fruit: String -> fruit.length})
1
Kotlin规定,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号外面,示例:
val maxLengthFruit = list.maxBy() {fruit: String -> fruit.length}
1
如果Lambda参数是函数的唯一一个参数,则可以把函数的括号省略,示例:
val maxLengthFruit = list.maxBy {fruit: String -> fruit.length}
1
由于Kotlin的类型推导机制,Lambda表达式中的参数列表在大多数情况下不必声明参数类型,示例:
val maxLengthFruit = list.maxBy {fruit -> fruit.length}
1
当Lambda表达式的参数列表只有一个参数时,也不必声明参数名,可以使用it关键字代替,示例:
val maxLengthFruit = list.maxBy {it.length}
1
map函数:
集合中map函数是最常用的一种函数式API,它用于将集合中的每一个元素都映射成另外的值,映射规则在Lambda表达式中指定,最终生成一个新的集合。
示例:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
//将单词转换成大写
val newList = list.map {it.toUpperCase()}
1
2
3
filter函数:
用来过滤集合中的数据。可以单独使用,也可以配合map函数使用,示例:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
//保留五个字母以内的单词,并转换成大写
val newList = list.filter {it.length <= 5}.map {it.toUpperCase()}
1
2
3
any和all函数:
any函数用于判断集合中是否存在一个元素满足指定条件,all函数用于判断集合中是否所有元素都满足指定条件。示例:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val anyResult = list.any {it.length <= 5} //true
val allResult = list.all {it.length <= 5} //false
1
2
3
3.Java函数式API的使用
如果我们在Kotlin代码中调用了一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API。Java单抽象方法接口指的是接口中只有一个待实现的方法。
Java中有一个最为常用的单抽象方法接口——Runnable接口。Java代码创建并执行一个子线程的代码如下:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("running!!")
}
}).start();
1
2
3
4
5
6
使用Kotlin,最简写法如下:
Thread {
println("running!!")
}.start()
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_45922212/article/details/115557579