- Kotlin编程实战:创建优雅、富于表现力和高性能的JVM与Android应用程序
- (美)文卡特·苏布拉马尼亚姆
- 968字
- 2025-02-27 12:54:45
5.6 使用映射
映射保存键–值对的集合。就像Kotlin为JDK列表提供只读不可变接口和读写可变接口一样,该语言也为JDK映射提供了两个接口。JDK 映射接口的所有方法都可以通过可变接口得到,而只读方法可以通过不可变接口得到。
你可以使用mapOf()创建映射并获取对只读接口Map<K, V>的引用。或者,使用mutableMapOf()访问MutableMap<K, V>。另外,你可以使用hashMapOf()获得对JDK HashMap的引用,使用linkedMapOf()获得对LinkedHashMap的引用,使用sortedMapOf()获得对SortedMap的引用。
让我们使用不可变/只读接口Map<K, V>创建一个示例,并查看访问元素的方法。下面是一段代码,用于创建站点名称及其对应的URL的映射,其中键和值都是字符串:

键–值对是使用to()扩展函数创建的该函数可用于Kotlin中的任何对象,而mapOf()则接受Pair<K, V>的vararg。size属性将告诉你映射中项的数量。
你可以使用keys属性遍历映射中所有的键,或者使用values属性遍历所有的值。还可以分别使用containsKey()和containsValue()方法来检查特定的键或值是否存在。
或者,你可以使用contains()方法或in运算符来检查键是否存在:

要访问键的值,可以使用get()方法,但有一个隐患。下面的方法行不通:

不能保证映射中存在一个键,因此可能没有该健的值。get()方法返回一个可空的类型——参见6.2节。Kotlin在编译时就保护我们,并希望我们使用可空的引用类型:

get()方法也用于索引运算符[],所以我们可以不使用get(),而使用该运算符:

这很方便,但是如果键不存在,我们可以通过提供另外一种方法——默认值,来避免可空的引用类型:

如果映射中不存在键"agiledeveloper",则作为第二个参数所提供的值将返回。否则,将返回实际的值。
mapOf()函数提供了一个只读引用,因此我们不能改变映射。但是我们可以创建一个新的带有额外键–值对的映射,如下所示:

类似地,我们可以使用-运算符创建一个新的映射,而某个特定的键不出现在原始映射中,如下所示:

要遍历映射中的项,可以使用我们在第4章中看到的for循环。让我们在这里使用for循环:

变量entry指向一个映射项,可以从该对象中获得键和值。但是,不使用这个额外的步骤,我们可以使用在3.4节中看到的解构特性来提取键和值,如下所示:

随着迭代的进行,Kotlin自动将每项中的键和值提取到名为key和value的不可变变量中,这得益于解构的特性。
我们在这里使用了命令式循环。在本书的后面,当探索内部迭代器时,我们将重温这个话题,来了解如何使用在第10章中介绍的函数式风格来遍历这些值。
映射接口也有两个特殊的方法,getValue()和setValue(),这两个方法使我们能够将映射用作委托——这是一个强大的概念,我们将在第9章中深入讨论。