集合的创建和遍历
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
for (fruit in list) {
println(fruit)
}
listOf()函数创建的是—个不可变的集合
若需要创建—个可变的集合,使用mutableListOf()函数就可以
val list = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
Set集合的用法 换成了setOf()和mutableSetOf()函数而已
传统的Map用法:
val map = HashMap<String, Int>()
map.put("Apple", 1)
在Kotlin中并不建议使用put()和get()方法来对Map进行添加和读取数据操作
更加推荐使用一种类似于数组下标的语法结构
map["Apple"] = 1
val number = map["Apple"]
Kotlin也提供了一对mapOf()和mutableMapOf()函数来继续简化Map的用法
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
这里看上去好像是使用to这个关键字来进行关联的,
但其实to并不是关键字,而是一个infix函数
for ((fruit, number) in map) {
println("fruit is $fruit, number is $number")
}
集合的函数式API
如何在—个水果集合里面找到单词最长的那个水果
val list = listOf("Apple", "Pear", "", "Banana", "Orange", "Grape", "Watermelon")
val maxLengthFruit = list.maxBy { it.length } // maxBy { t -> t.length } 的简写
println("max length fruit is $maxLengthFruit")
- 筛选 filter
- 切片 limit skip
- 去重 distinct
- 映射 map flatMap
- 排序 sorted
- 匹配 allMatch anyMatch noneMatch
- 查找 findFirst findAny count max min
- 归约 reduce
- 搜集 collect
val list = listOf("Apple", "Pear", "", "Banana", "Orange", "Grape", "Watermelon")
val list2 = list.filter { it.isNotEmpty() }.sorted().map { "hi $it" }
Lambda的定义:
Lambda就是—小段可以作为参数传递的代码
Lambda表达式的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
最外层是—对大括号,如果有参数传入到Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用—个->符号,表示参数列表的结束以及函数体的开始,函数体中可以编写任意行代码,并且最后—行代码会自动作为Lambda表达式的返回值。
由繁入简
maxBy函数的工作原理是根据我们传入的条件来遍历集合,从而找到该条件下的最大值
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val lambda = { fruit: String -> fruit.length }
val maxLengthFruit = list.maxBy(lambda)
第—步简化
val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })
Kotlin规定,当Lambda参数是函数的最后—个参数时,可以将Lambda表达式移到函数括号的外面
val maxLengthFruit = list.maxBy() { fruit: String -> fruit.length }
如果Lambda参数是函数的唯——个参数的话,还可以将函数的括号省略
val maxLengthFruit = list.maxBy { fruit: String -> fruit.length }
由于Kotlin拥有出色的类型推导机制,
val maxLengthFruit = list.maxBy { fruit -> fruit.length }
当Lambda表达式的参数列表中只有—个参数时,也不必声明参数名,而是可以使用it关键字来代替
val maxLengthFruit = list.maxBy { it.length }
常用API
map
用于将集合中的每个元素都映射成—个另外的值,映射的规则在Lambda表达式中指定,最终生成—个新的集合
val newList = list.map { it.toUpperCase() }
filter
用来过滤集合中的数据的
val newList = list.filter { it.length <= 5 }
any和all函数
any 函数用于判断集合中是否至少存在一个元素满足指定条件
all函数用于判断集合中是否所有元素都满足指定条件
val anyResult = list.any { it.length <= 5 }
val allResult = list.all { it.length <= 5 }
sort 排序
distinct 去重
Java函数式API的使用
java 方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running");
}
}).start();
new Thread(() -> System.out.println("Thread is running")).start();
kotlin 方式
Thread(object : Runnable {
override fun run() {
println("Thread is running")
}
}).start()
因为Runnable类中只有—个待实现方法,即使这里没有显式地重写run()方法,Kotlin也能自动明白Runnable后面的Lambda表达式就是要在run()方法中实现的内容。
可简化为:
Thread(Runnable {
println("Thread is running")
}).start()
如果—个Java方法的参数列表中有且仅有—个Java单抽象方法接口参数,我们还可以将接口名进行省略
Thread({
println("Thread is running")
}).start()
当Lambda表达式是方法的最后—个参数时,可以将Lambda表达式移到方法括号的外面。同时,如果Lambda表达式还是
方法的唯——个参数,还可以将方法的括号省略,最终简化:
Thread {
println("Thread is running")
}.start()
使用示例:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {}
});
kotlin中可简化为:
button.setOnClickListener {}
共同學習,寫下你的評論
評論加載中...
作者其他優質文章