许多现代高级语言在很早之前就开始支持Lambda编程,但是Java到JDK 1.8之后才开始支持,导致大量早期Java和Android开发并未使用Lambda编程的特性
而Kotlin从第一个版本就开始了对Lambda的支持,并且Kotlin中的Lambda极为强大,我们来开始进行Lambda的入门
集合的创建与遍历
集合的函数式API是用来入门 Lambda 的绝佳示例
传统意义上的集合主要是List和Set,再广泛的话Map这样包括键值对的也可以包含进来
List的主要实现类是ArrayList和LinkedList
Set的主要实现类是HashSet
Map的主要实现类是HashMap
以上是Java中非常熟悉的集合
现在有一个要求,创建包含许多水果名称大集合,在Java中可以创建一个ArrayList,将水果名称一个个添加到集合当中,当然Kotlin也可以这样做:
fun addFruit() {
val list = ArrayList<String>()
list.add("苹果")
list.add("西瓜")
list.add("橙子")
list.add("橘子")
list.add("葡萄")
list.add("香蕉")
}
Kotlin提供一个内置函数listof()来简化初始化函数:
val list = listOf("苹果", "西瓜", "橙子")
我们循环这个集合
fun addFruit() {
val list = listOf("苹果", "西瓜", "橙子")
for (fruit in list) {
println(fruit)
}
}
需要注意的是,listof()创建的是一个不可变的集合,也就是说这个集合只能读,不能写
这么设计的理由和val和类默认不可继承是一个道理
如果我们想创建一个可变的函数,那么使用mutableListOf()就可以了
fun addFruit() {
val list = mutableListOf("苹果", "西瓜", "橙子")
list.add("香蕉")
for (fruit in list) {
println(fruit)
}
}
以上是List的用法,实际上Set的用法几乎与此一模一样,只是将创建集合的方式变成了setOf()和mutableSetof()而已
注意:Set集合底层是使用hash映射来存放数据的,因此元素无法保证有序,这是和List集合最大的不同
Map集合:Map是一种键值对形式的数据结构,因此在用法上和List、Set有较大不同.传统的Map用法是先创建一个HashMap的实例,然后将一个个键值对数据添加到Map中:
val map = HashMap<String, String>()
map.put("aa", "aaa")
map.put("aa1", "aaa1")
map.put("aa2", "aaa2")
map.put("aa3", "aaa3")
这种写法是和Java最相似的,但是Kotlin并不建议使用put()和get()方法来对Map进行添加和读取数据操作,而是更推荐一种类似于数组下标的语法结构:
map["abb"] = "abb"
取值则:
val va = map["abb"]
当然,这仍然不是最简便的写法,Kotlin提供了mapOf()和mutableMapOf()函数来继续简化Map的用法.在mapOf()函数中,我们可以直接传入初始化的键值对组合来完成对Map集合的创建:
val map = mapOf("ab" to "ab", "bc" to "aa")
这样看上去好像是用to关键字来关联的,但其实to不是一个关键字,而是一个infix函数,这点在后续会补充
val map = mapOf("ab" to "ab", "bc" to "aa")
for ((key, value) in map) {
println("name is $key, value is $value")
}
使用这种方法可以同时获取键和值