一、创建与遍历集合
1.List与Set集合
(1).不可变集合:无法进行增删改查操作
val list = listOf("王大锤", "愣子", "欧阳疯子")
(2).可变集合:可以进行增删改查操作
val list = mutableListOf("王大锤", "愣子", "欧阳疯子")
list.add("李大麻子")
for (i in list) {
println(i)
}
//输出日志:王大锤 愣子 欧阳疯子 李大麻子
Set用法与List一模一样,只是替换成了setOf()
和mutableSetOf()
,另外List是有序的,Set是无序的。
2.Map集合
(1).数组下标语法结构的写法
val map = HashMap<String, Int>()
map["王大锤"] = 1
map["李大麻子"] = 2
map["愣鬼"] = 3
取数据
val number = map["愣鬼"]
(2).mapOf、mutableMapOf的写法
val map = mapOf("王大锤" to 1, "李大麻子" to 2, "愣鬼" to 3)
for ((key, value) in map) {
println(key + value)
//输出日志:王大锤1 李大麻子2 愣鬼3
}
二、集合的函数式API
1.Lambda表达式
Lambda的定义:Lambda就是一小段可以作为参数传递的代码。
Lambda语法结构:{参数名1 : 参数类型 , 参数名2 : 参数类型 -> 函数体}
,首先最外层是一对大括号,如果有参数传入的话,需要声明参数列表,参数列表的结尾使用一个 -> 符号,表示参数列表的结束与函数体的开始,函数体中可以编写任意行代码,并且最后一段代码会自动作为Lambda的返回值。
(1)maxBy()函数
工作原理:它接受的是一个Lambda类型的参数,根据我们传入的条件来遍历集合,从而找到条件下的最大值。
eg:找出集合中单词最长的名字:
val list = listOf("王大锤", "愣子", "欧阳疯子")
var maxLenthName = ""
for (i in list) {
if (i.length > maxLenthName.length) {
maxLenthName = i
}
}
使用集合式API简化后
val list = listOf("王大锤", "愣子", "欧阳疯子")
//简化一
val lambda = { name: String -> name.length }
list.maxBy(lambda)
//简化二
list.maxBy({ name: String -> name.length })
//简化三
list.maxBy() { name: String -> name.length }
//简化四
list.maxBy { name: String -> name.length }
//简化五
list.maxBy { name -> name.length }
//简化六
list.maxBy { it.length }
原理:
1.当Lambda参数是函数最后一个参数时,可以将Lambda表达式移到函数括号外面 (二到三)。
2.当Lambda参数势函数唯一一个参数时,可以将函数的括号省略(三到四)。
3.由于Kotlin拥有出色的类型推导机制,Lambda表达式中的参数列表大多数情况下不必声明参数类型(四到五)。
4.当Lambda表达式中的参数列表只有一个参数时,不必声明参数名,可以使用it关键字来代替(五到六)。
接下来我们再学习几个常见的函数式API
(2)map()函数
工作原理:用于将集合中每个元素都映射成一个另外的值,映射规则在Lambda表达式中指定,最终生成一个新的集合。eg:
fun main() {
val list = listOf("apple", "banana", "pear")
val newList = list.map { it.toUpperCase() }
for (i in newList) {
print(i)
//输出日志:APPLE BANANA PEAR
}
}
(3)filter()函数
工作原理:用来过滤集合中的数据,过滤规则在Lambda表达式中指定,,最终生成一个新的集合,可结合map()函数使用。eg:
un main() {
val list = listOf("apple", "banana", "pear")
val newList = list.filter { it.length > 4 }.map { it.toUpperCase() }
for (i in newList) {
print(i)
//输出日志:APPLE BANANA
}
}
(4)any()函数与all()函数
any():用于判断集合中是否至少存在一个元素满足指定条件。
all():用于判断集合中是否全部函数都满足指定条件。
eg:
fun main() {
val list = listOf("apple", "banana", "pear")
val anyResult = list.any() { it.length == 4 }
val allResult = list.all() { it.length == 4 }
println("anyResult is " + anyResult + " ,allResult is" + allResult)
//输出日志:anyResult is true ,allResult isfalse
}
三、Java的函数式API
含义:我们在Kotlin中调用一个Java方法,并且该方法接收一个Java单抽象方法接口参数,就可以使用函数式API。Java单抽象方法接口指的是接口中只有一个待实现的方法,如果接口中有多个待实现的方法,则无法使用函数式API。
举个栗子:Java中最常见的单抽象方法接口--Runnable接口:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running");
}
}).start();
使用Kotlin版本:
Thread(object : Runnable {
override fun run() {
print("Thread is running")
}
}).start()
使用函数式API简化:
//简化一
Thread(Runnable {
print("Thread is running")
}).start()
//简化二
Thread {
print("Thread is running")
}.start()
原理:因为只有一个待实现方法,我们就算不写,Kotlin也会明白。另外,如果一个Java参数列表中不存在一个以上Java单抽象方法接口参数,我们还可以将接口名进行省略。
Android中常用的点击事件接口OnclickListener就是一个单抽象方法接口,就可以使用函数式API
tv.setOnClickListener{
}
网友评论