这是我参与「第四届青训营 」笔记创作活动的第15天
集合的创建与遍历
- 传统意义上的集合主要就是List和Set,再广泛一点的话,像Map这样的键值对数据结构也可 以包含进来。List、Set和Map在Java中都是接口,List的主要实现类是ArrayList和 LinkedList,Set的主要实现类是HashSet,Map的主要实现类是HashMap,熟悉Java的人 对这些集合的实现类一定不会陌生。
- 现在我们提出一个需求,创建一个包含许多水果名称的集合。如果是在Java中你会怎么实现 ? 可能你首先会创建一个ArrayList的实例,然后将水果的名称一个个添加到集合中。当然,在 Kotlin中也可以这么做,但是这种初始化集合的方式比较烦琐,为此,kotlin专门提供了一个内置的listof()函数来简化初始化集合的写法:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
不过需要注意的是,listOf()函数创建的是一个不可变的集合。
如果我们确实需要创建一个可变的集合的话,使用
mutableListOf()函数就可以了。
set集合
实际上Set集合的用法几乎与此一模一样,只是将创建
集合的方式换成了setOf()和mutableSetOf()函数而已。
需要注意,Set集合中是不可以存放重复元素的,如果存放了多个相同的元素,只会保留其中一
份,这是和List集合最大的不同之处。
Map集合
最后再来看一下Map集合的用法。Map是一种键值对形式的数据结构,因此在用法上和List、
Set集合有较大的不同。传统的Map用法是先创建一个HashMap的实例,然后将一个个键值对数据添加到Map中。比如这里我们给每种水果设置一个对应的编号,就可以这样写:
在mapOf()函数中,我们可以直接传入初始化
的键值对组合来完成对Map集合的创建:
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
集合的函数式API
首先我们来思考一下,如何在一个水果集合里面找到单词最长的那个水果?
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
var maxLengthFruit = ""
for (fruit in list) {
if (fruit.length > maxLengthFruit.length) {
maxLengthFruit = fruit
}
}
println("max length fruit is " + maxLengthFruit)
如果我们使用集合的 函数式API,就可以让这个功能变得更加容易:
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape", "Watermelon")
val maxLengthFruit = list.maxBy { it.length }
println("max length fruit is " + maxLengthFruit)
上述代码使用的就是函数式API的用法,只用一行代码就能找到集合中单词最长的那个水果。 接着我们来看一下Lambda表达式的语法结构:
{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
这是Lambda表达式最完整的语法结构定义。
首先最外层是一对大括号,如果有参数传入到
Lambda表达式中的话,我们还需要声明参数列表,参数列表的结尾使用一个->符号,表示参
数列表的结束以及函数体的开始,函数体中可以编写任意行代码(虽然不建议编写太长的代
码),并且最后一行代码会自动作为Lambda表达式的返回值。