许多现代高级语言在很早之前就开始支持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")
}

使用这种方法可以同时获取键和值